0

まず、python 2.4.4 しか使用できません

起動し、さまざまなサブプロセスが環境にどのように影響するかを監視するプロセスコントローラーをPythonで作成する必要があります。これらの各サブプロセスは、それ自体が python スクリプトです。

UNIX シェルから実行すると、コマンド ラインは次のようになります。

python myscript arg1 arg2 arg3 >output.log 2>err.log &

私は入力にも出力にも興味がありません.pythonは処理する必要はありません. Python プログラムは、1) 各プロセスの pid 2) 各プロセスが実行されているかどうかだけを知る必要があります。

そして、プロセスは継続的に実行されます。

出力を読み込んで、もう一度ファイルに送信しようとしましたが、readlineが非同期ではないという問題に遭遇しました。その多くは非常に複雑です。

bash リダイレクト操作を保持する python サブプロセス呼び出しを作成するにはどうすればよいですか?

ありがとう

4

3 に答える 3

1

私があなたの質問を正しく理解していれば、ここで探しているのは、出力をファイルにリダイレクトしてスクリプトのリストを起動できるようにすることのようです。その場合、次のように各タスクを起動します。

task = subprocess.Popen(['python', 'myscript', 'arg1', 'arg2', 'arg3'],
    stdout=open('output.log', 'w'), stderr=open('err.log', 'w'))

これを行うと、サブプロセスの stdout と stderr は監視プロセスが開いたファイルにリダイレクトされますが、監視プロセスはデータのコピーに関与する必要はありません。必要に応じて、サブプロセスの標準入力もリダイレクトできます。

この例では処理されていないエラー ケースなどを処理する必要があることに注意してください。

于 2012-10-18T17:34:28.533 に答える
0

subprocess.Popenへのstdout/stderr引数として既存のファイル記述子を使用できます。これは、bashからのリダイレクトを使用して実行することと同等である必要があります。このリダイレクトは、フォークの後にfdup(2)を使用して実装され、出力がプログラムに影響を与えることはありません。おそらく、ファイル記述子としてfopen('/ dev / null')を渡すこともできます。

または、コントローラープログラムのstdout / stderrをリダイレクトし、Noneをstdout/stderrとして渡すこともできます。子は、Python自体を経由せずに、コントローラーstdout/stderrに出力する必要があります。これが機能するのは、子が起動時にbashによってリダイレクトされたコントローラーのstdin/stdout記述子を継承するためです。

于 2012-10-18T17:38:18.877 に答える
0

subprocess モジュールは良いです。

*ix で os.fork() を使用し、定期的な os.wait() を WNOHANG で実行することもできます。

于 2012-10-18T18:58:04.430 に答える