jython убивает родительский процесс, который порождает подпроцесс, прерывает стандартный вывод подпроцесса в файл?

#python #jython

#python #jython

Вопрос:

Позвольте мне начать с того, что я действительно пытаюсь сделать. Нам нужен независимый от платформы сценарий запуска для вызова JVM с некоторыми системными свойствами и динамически генерируемым путем к классам. Мы выбрали Jython в частности, потому что нам нужно зависеть только от автономного jython.jar в нашем сценарии запуска. Мы решили, что можем написать скрипт jython, который использует подпроцесс.Popen для запуска jvm нашего приложения, а затем завершается.

Еще одна вещь. Наше приложение использует много устаревшего отладочного кода, который выводится в стандартном виде. Таким образом, сценарий запуска обычно перенаправляет стандартный вывод / stderr в файл журнала. Я попытался воспроизвести это с помощью нашего скрипта jython следующим образом:

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

После этой строки скрипт запуска и хостинг jvm для jython завершается. Проблема в том, что в файле журнала ничего не отображается. Если я вместо этого сделаю это:

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

затем мы получаем журналы. Значит, родительский процесс должен выполняться параллельно процессу приложения, запущенному через подпроцесс? Я хочу избежать двух запущенных jvm.

Можете ли вы вызвать подпроцесс таким образом, чтобы стандартный файл был записан, даже если родительский процесс завершается? Есть ли лучший способ запустить jvm приложения из jython? Является ли Jython плохим решением в любом случае?

Ответ №1:

Нам нужен независимый от платформы сценарий запуска для вызова JVM с некоторыми системными свойствами и динамически генерируемым путем к классам.

Вы могли бы использовать независимый от платформы скрипт для создания сценария запуска, зависящего от платформы, либо во время установки, либо перед каждым вызовом. В последнем случае, кроме того, вам нужен простой статический скрипт, зависящий от платформы, который вызывает ваш независимый от платформы сценарий запуска, генерирующий скрипт, а затем сам сгенерированный скрипт. В обоих случаях вы запускаете свое приложение, вызывая статический скрипт, зависящий от платформы.

Можете ли вы вызвать подпроцесс таким образом, чтобы стандартный файл был записан, даже если родительский процесс завершается?

Вы можете открыть file / redirect в дочернем процессе, например, используя shell:

 Popen(' '.join(args ['>', 'logFile', '2>amp;1']), # shell specific cmdline
      shell=True) # on Windows see _cmdline2list to understand what is going on
 

Комментарии:

1. Спасибо! Использование shell=True и конвейерная обработка вывода сработали. Теперь моя единственная проблема заключается в том, что запуск происходит довольно медленно, учитывая, что я запускаю jvm только для запуска сценария запуска для запуска jvm. Ваш первый вариант исправит это, но я не уверен, как вы это сделаете? Существуют ли какие-либо библиотеки или инструменты для преобразования некоторого подмножества python или чего-то еще в скрипты Windows bat или bash?

2. @tal: Взгляните на собственный jython StartScriptGenerator.java и сценарии оболочки