Jython забівае бацькоўскі працэс, які спараджае подпроцесс Перапынкі подпроцесса стандартнага вываду ў файл?

Дазвольце мне пачаць з таго, што я на самой справе спрабую зрабіць. Мы хочам, незалежна ад платформы сцэнарыя запуску для выкліку на JVM з некаторымі сістэмнымі ўласцівасцямі і дынамічна генераванымі класамі. Мы выбралі Jython, у прыватнасці, таму, што нам трэба толькі залежаць ад аўтаномнай jython.jar ў нашым сцэнары запуску. Мы вырашылі, што мы маглі б напісаць сцэнар, які выкарыстоўвае Jython subprocess.Popen для запуску JVM нашага прыкладання, а затым завяршае працу.

Яшчэ адна рэч. Наша дадатак выкарыстоўвае шмат спадчыну кода адладкі, які друкуе на стандартны вывад. Такім чынам, сцэнар запуску, як правіла, быў перанакіроўваць стандартны вывад/STDERR ў лог-файл. Я спрабаваў прайграць, што з нашым Jython сцэнар, як гэта:

subprocess.Popen(args,stdout=logFile,stderr=logFile)

Пасля гэтага радка скрыпт запуску і хостынг для JVM Jython завяршаецца. Праблема заключаецца ў тым нічога не адлюстроўваецца ў лог-файл. Калі я замест гэтага:

subprocess.Popen(args,stdout=logFile,stderr=logFile).wait()

то мы атрымліваем часопісы. Такім чынам, бацькоўскі працэс павінен ісці паралельна з працэсам прыкладання пры запуску з дапамогай подпроцесса? Я хачу, каб пазбегнуць два працуюць JVMs.

Вы можаце выклікаць подпроцесс такім чынам, што файл стандартнага вываду будзе запісаны нават калі бацькоўскі працэс завяршаецца? Ці ёсць лепшы спосаб для запуску віртуальнай машыны Java прыкладанняў з Jython? Ці з'яўляецца Jython дрэннае рашэнне ў любым выпадку?

1

1 адказы

<Р> Мы хочам, незалежна ад платформы сцэнар запуску для выкліку на JVM з некаторымі сістэмнымі ўласцівасцямі і дынамічна генераваны шлях да класаў.

Вы можаце выкарыстоўваць незалежна ад платформы скрыпту для стварэння платформы канкрэтнага сцэнару запуску альбо падчас ўстаноўкі або перад кожным выклікам. У апошнім выпадку, акрамя таго, вам патрэбен просты статычны платформы канкрэтны сцэнар, які запускае свой незалежна ад платформы запуску-скрыпт генеравальны скрыпт, а затым сам згенераваны скрыпт. У абодвух выпадках вы запусціце прыкладанне, выклікаўшы статычны платформы канкрэтны сцэнар.

<Р> Вы можаце выклікаць подпроцесс такім чынам, што файл стандартнага вываду будзе запісаны нават калі бацькоўскі працэс завяршаецца?

Вы можаце адкрыць файл/перанакіраваньне ў даччыны працэс, напрыклад, з выкарыстаннем абалонкі:

Popen(' '.join(args+['>', 'logFile', '2>&1']), # shell specific cmdline
      shell=True) # on Windows see _cmdline2list to understand what is going on
1
дададзена
@tal: Паглядзіце на Jython »ўласнага StartScriptGenerator.java і скрыпты
дададзена аўтар jfs, крыніца
Дзякуй! Выкарыстанне абалонкі = True і перанаправіўшы выснову працаваў. Цяпер мая адзіная праблема ў тым, што запуск адбываецца даволі павольна, улічваючы, што я выхоўваю JVM, каб проста запусціць скрыпт запуску для выхоўвае JVM. Ваш першы варыянт выправіць гэта, але я не ведаю, як вы б ісці аб тым, што рабіць? Ёсць некаторыя бібліятэкі і прылады для пераўтварэння некаторага падмноства пітона ці яшчэ што-то акно біты або Баш сцэнарыяў?
дададзена аўтар kenen, крыніца