私は、サブプロセスのstdoutパイプから出力を得ることにいくつかの困難を抱えています。私はログ出力を抽出するために、それを介していくつかの第三者コードを起動しています。サードパーティのコードが最近更新されるまで、すべて正常に機能しました。更新後、pythonは無期限にブロックを開始し、実際に出力を表示しません。私は手動でサードパーティのアプリを正常に起動し、出力を見ることができます。WindowsのPythonサブプロセス出力?
私が使用しているコードの基本的なバージョン:
import subprocess, time
from threading import Thread
def enqueue_output(out):
print "Hello from enqueue_output"
for line in iter(out.readline,''):
line = line.rstrip("\r\n")
print "Got %s" % line
out.close()
proc = subprocess.Popen("third_party.exe", stdout=subprocess.PIPE, bufsize=1)
thread = Thread(target=enqueue_output, args=(proc.stdout,))
thread.daemon = True
thread.start()
time.sleep(30)
私はこのスクリプトのthird_party.exeに置き換える場合、これは完璧に動作します:
import time, sys
while True:
print "Test"
sys.stdout.flush()
time.sleep(1)
だから私は魔法のよう不明確ですこれを元のコマンドで処理するには、実行する必要があります。
これらは私がいない成功を収めて試してみたsubprocess.Popenラインのすべての亜種は、以下のとおりです。
proc = subprocess.Popen("third_party.exe", stdout=subprocess.PIPE, bufsize=0)
proc = subprocess.Popen("third_party.exe", stdout=subprocess.PIPE, shell=True)
proc = subprocess.Popen("third_party.exe", stdout=subprocess.PIPE, creationflags=subprocess.CREATE_NEW_CONSOLE)
si = subprocess.STARTUPINFO()
si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW
proc = subprocess.Popen("third_party.exe", stdout=subprocess.PIPE, startupinfo=si)
編集1: 私は実際にこのケースでは().communicate使用することはできません。私が立ち上げているアプリは長時間(数日から数週間)実行されています。私が実際に試すことができる唯一の方法は、起動した直後にアプリを殺すことです。私はそれが私に有効な結果を与えるとは思わないのです。
この失敗したのであっても非スレッドバージョン:
import subprocess, time
from threading import Thread
proc = subprocess.Popen("third_party.exe", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print "App started, reading output..."
for line in iter(proc.stdout.readline,''):
line = line.rstrip("\r\n")
print "Got: %s" % line
編集2:大丈夫JDIへ おかげで、次のような作品:
import tempfile, time, subprocess
w = "test.txt"
f = open("test.txt","a")
p = subprocess.Popen("third_party.exe", shell=True, stdout=f,
stderr=subprocess.STDOUT, bufsize=0)
time.sleep(30)
with open("test.txt", 'r') as r:
for line in r:
print line
f.close()
サードパーティプログラムがstderrへの書き込みに切り替えられた可能性はありますか? – jdi
そうではないようです。代わりにstderrを傍受すると、同じことが起こります(しかし、私はコンソール上でアプリケーションの出力を見ていますが、印刷しているだけで、Pythonを経由していません)。 – devicenull
アプリケーションが標準出力の使用を停止し、コンソールに直接書き込んでいるかのように聞こえます。もしそうなら、これについてあなたができることはあまりありません。アプリのベンダーに確認できますか? –