1

編集:おっと!質問に一致しないコードを誤って投稿してしまいました。実験が完了する前にこの投稿を書き始めたので、テスト プロセスの中間点からコードを投稿しました。この質問を修正して、コードを少し変更することで、実際に投稿するつもりだったものを反映させました。

次の Python コードは、1 つの問題で期待どおりに動作します。ファイルを正常に作成するために、基になる Perl スクリプトに対して output.stdout.read() を呼び出す必要があるのはなぜですか?

cmdStringList = ["perl","script.pl","arg1",...]

output = subprocess.Popen(cmdStringList,stdout=subprocess.PIPE)

if verbose:
    print output.stdout.read()

実稼働環境で verbose=False を指定して Python スクリプトを実行しようとするまで、何か問題があることに気づきませんでした。Popen とサブプロセスの動作を理解するために google-fu を実行しましたが、この動作の理由はわかりませんでした。どんな助けでも大歓迎です。

4

2 に答える 2

1

ストリームを読み続ける必要があります。そうしないと、バッファがいっぱいになり、perlプロセスがブロックされる可能性があります。それは特定の言語とは何の関係もありませんが、オペレーティングシステムを弱体化させています。

Javaを使用しているときに同様の問題が発生しました。

于 2013-02-07T01:28:17.137 に答える
1

あなたは実際に次のコードを持っていますよね?

if verbose:
    outputRead = output.stdout.read()
    print outputRead

問題は、子が STDOUT に書き込もうとしてブロックされていることである可能性が非常に高いです。パイプから読み取ってパイプにスペースを空けるまで、子プロセスは STDOUT への書き込みを完了できず、参照先のファイルを作成する場所に移動できません。

子が読み取らずにブロックするのを防ぎたい場合は、stdout をnul(Windows) または/dev/null(他の場所) にリダイレクトします。これは、Windows 以外のすべての場所で機能するはずです。

cmdStringList = ["sh","-c","\"$0\"" \"$@\" >/dev/null","perl","script.pl","arg1",...]

(構文エラーはご容赦ください。私は Python をまったく知りません。)

于 2013-02-07T00:33:35.693 に答える