41

Test_Pipe.py の実行からの出力が必要です。Linux で次のコードを試しましたが、うまくいきませんでした。

Test_Pipe.py

import time
while True :
    print "Someting ..."
    time.sleep(.1)

Caller.py

import subprocess as subp
import time

proc = subp.Popen(["python", "Test_Pipe.py"], stdout=subp.PIPE, stdin=subp.PIPE)

while True :
    data = proc.stdout.readline() #block / wait
    print data
    time.sleep(.1)

回線proc.stdout.readline()がブロックされているため、データは出力されません。

4

4 に答える 4

47

明らかに subprocess.communicate を使用できますが、リアルタイムの入力と出力を探していると思います。

プロセスがおそらくあなたの入力を待っているため、readline がブロックされました。次のように、これを克服するために文字ごとに読み取ることができます。

import subprocess
import sys

process = subprocess.Popen(
    cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE
)

while True:
    out = process.stdout.read(1)
    if out == '' and process.poll() != None:
        break
    if out != '':
        sys.stdout.write(out)
        sys.stdout.flush()
于 2009-09-07T11:04:18.863 に答える
21

Nadia のスニペットは機能しますが、1 バイトのバッファーで read を呼び出すことは強くお勧めしません。これを行うより良い方法は、fcntl を使用して stdout ファイル記述子を非ブロックに設定することです。

fcntl.fcntl(
    proc.stdout.fileno(),
    fcntl.F_SETFL,
    fcntl.fcntl(proc.stdout.fileno(), fcntl.F_GETFL) | os.O_NONBLOCK,
)

そして select を使用して、データの準備ができているかどうかをテストします

while proc.poll() == None:
    readx = select.select([proc.stdout.fileno()], [], [])[0]
    if readx:
        chunk = proc.stdout.read()
        print chunk

Caller.py と Test_Pipe.py が提供どおりに機能するため、問題は投稿したものとは異なるはずであるという点で、彼女は正しかったです。

于 2010-08-21T07:03:19.627 に答える
15

Test_Pipe.pyはデフォルトで stdout をバッファリングするためproc、 inCaller.pyは子のバッファがいっぱいになるまで出力を確認しません (バッファ サイズが 8KB の場合、Test_Pipe.pyの stdout バッファがいっぱいになるまで約 1 分かかります)。

-u出力をバッファなし (テキスト ストリームの行バッファ) にするには、フラグを子 Python スクリプトに渡すことができます。サブプロセスの出力を「リアルタイム」で行ごとに読み取ることができます。

import sys
from subprocess import Popen, PIPE

proc = Popen([sys.executable, "-u", "Test_Pipe.py"], stdout=PIPE, bufsize=1)
for line in iter(proc.stdout.readline, b''):
    print line,
proc.communicate()

Pythonのリンクを参照してください: Python 以外の子プロセスのブロック バッファリングの問題を解決する方法については、subprocess.communicate() からのストリーミング入力を読んでください。

于 2013-07-17T13:53:02.633 に答える
14

「サブプロセスの出力をメインプロセスにリアルタイムで取得する」などのタスクのバッファリングで常に発生する可能性のある多くの問題を回避するために、Windows 以外のすべてのプラットフォームではpexpectを使用し、Windows ではwexpect使用することを常にお勧めします。タスクが望まれます。subprocess

于 2009-09-07T16:10:41.603 に答える