サブプロセスがサブプロセスstdoutをファイルに分割する子プロセスを殺すjythonの殺害?

私が本当にやろうとしていることから始めましょう。いくつかのシステムプロパティと動的に生成されたクラスパスを持つJVMを呼び出すための、プラットフォームに依存しない起動スクリプトが必要です。私たちは起動スクリプトのスタンドアロンのjython.jarに依存する必要があるだけなので、特にJythonを選びました。私たちは、アプリケーションのjvmを起動するためにsubprocess.Popenを使用するjythonスクリプトを記述して終了することにしました。

もう一つ。私たちのアプリケーションは、標準出力に出力する多くのレガシーデバッグコードを使用しています。したがって、通常、起動スクリプトはstdout/stderrをログファイルにリダイレクトしています。私はこのような私たちのjythonスクリプトでそれを再現しようとしました:

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

この行の後に、ランチャースクリプトとjython用のjvmホストが終了します。問題はlogFileに何も表示されないことです。私が代わりにこれを行う場合:

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

ログを取得します。したがって、親プロセスは、サブプロセスを介して起動されるアプリケーションプロセスと並行して実行する必要がありますか?私は2つのjvmsを実行することを避けたい。

親プロセスが終了してもstdoutファイルが書き込まれるようにサブプロセスを呼び出すことはできますか? jythonからアプリケーションjvmを起動するには良い方法はありますか?とにかくJythonは悪い解決策ですか?

1

1 答え

いくつかのシステムプロパティと動的に生成されたクラスパスを持つJVMを呼び出すための、プラットフォームに依存しない起動スクリプトが必要です。

プラットフォームに依存しないスクリプトを使用して、インストール時または各呼び出しの前に、プラットフォーム固有の起動スクリプトを生成することができます。後者の場合、さらに、プラットフォームに依存しない起動スクリプト生成スクリプトと生成スクリプト自体を呼び出す単純な静的プラットフォーム固有のスクリプトが必要です。どちらの場合も、静的プラットフォーム固有のスクリプトを呼び出すことによってアプリケーションを起動します。

親プロセスが終了してもstdoutファイルが書き込まれるようにサブプロセスを呼び出すことはできますか?

例えばシェルを使って子プロセスでファイル/リダイレクトを開くことができます:

Popen(' '.join(args+['>', 'logFile', '2>&1']), # shell specific cmdline
      shell=True) # on Windows see _cmdline2list to understand what is going on
1
追加された
追加された 著者 jfs,
ありがとう! shell = Trueを使用し、出力をパイプ処理しました。今私の唯一の問題は、JVMを立ち上げるためのスタートアップスクリプトを起動するためにjvmを起動することを考えると、起動がかなり遅いということです。あなたの最初の選択肢はそれを修正するだろうが、私はあなたがそれをどうやってやっていくのか分からない。いくつかのライブラリやPythonのサブセットをWindowsのbatやbashスクリプトに変換するためのツールはありますか?
追加された 著者 kenen,