2

Python コード内から、標準入力からパラメーターを取得するバイナリ プログラムを実行したいと考えています。subprocess モジュールを使用すると、これは簡単です。

import subprocess
command = [ 'my_program' ]
p = subprocess.Popen( command,  \
        stdin = subprocess.PIPE, stdout = subprocess.PIPE, \
        env={ "GFORTRAN_UNBUFFERED_ALL": "1"} )
p.stdin.write ( stdin_stuff )
while True:
  o = p.stdout.readline()
  if p.poll() != None: 
    break
  # Do something with stdout

これでプログラムが起動しますが、python スクリプトがそこでハングします。これはgfortranが原因である可能性があることを理解しています(my_programをコンパイルするために使用するのは、stdoutストリームをバッファリングしています.gfortranは、私が行ったようにGFORTRAN_UNBUFFERED_ALL環境変数を使用するだけでなく、fortranコードでFLUSH()組み込みを使用することもできます、しかしまだ運が悪い: python コードはまだハングします。

4

2 に答える 2

4

手動で書き込むよりもPopen.communicate()、文字列をプロセスに送信する方がうまくいくはずです。stdin

stdoutdata, stderrdata = p.communicate(stdin_stuff)
于 2011-02-09T16:42:21.233 に答える
2

Aphexの回答を補完するために、ここにドキュメントの関連部分があります:

警告

communicate()またはではなく.stdin.write.stdout.readまたはを使用.stderr.readして、他の OS パイプ バッファがいっぱいになり、子プロセスをブロックすることによるデッドロックを回避します。

于 2011-02-09T16:50:06.867 に答える