それが実行されている間、サブプロセスの標準出力をインターセプト
-
22-08-2019 - |
質問
これは私のサブプロセスの場合:
import time, sys
for i in range(200):
sys.stdout.write( 'reading %i\n'%i )
time.sleep(.02)
そして、これはサブプロセスの出力を制御し、変更するスクリプトです。
import subprocess, time, sys
print 'starting'
proc = subprocess.Popen(
'c:/test_apps/testcr.py',
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE )
print 'process created'
while True:
#next_line = proc.communicate()[0]
next_line = proc.stdout.readline()
if next_line == '' and proc.poll() != None:
break
sys.stdout.write(next_line)
sys.stdout.flush()
print 'done'
プロセスが実行中に行われるまで、なぜreadline
とcommunicate
が待っていますか?標準出力をリアルタイムにサブプロセスを渡す(および変更)するための簡単な方法はありますか?
ところで、私はこれを見てきましたが、私は(それの多くを理解し、気にやりなさい)ロギング機能を必要としません。
私は、Windows XP上でだ。
解決
チャールズは既に述べたように、問題はバッファリングです。私はsnmpdのためのいくつかのモジュールを書くときにも同様の問題に走った、と自動フラッシングバージョンで標準出力を置き換えることによってそれを解決します。
私はActiveStateの上でいくつかの記事に触発され、次のコードを、使用しました
class FlushFile(object):
"""Write-only flushing wrapper for file-type objects."""
def __init__(self, f):
self.f = f
def write(self, x):
self.f.write(x)
self.f.flush()
# Replace stdout with an automatically flushing version
sys.stdout = FlushFile(sys.__stdout__)
他のヒント
プロセス出力がバッファリングされます。よりUNIXyオペレーティングシステム(またはCygwinの)上に、 pexpect のモジュールは、必要なすべてを列挙しており、利用可能ですバッファリングに関連する問題を回避するための呪文。しかし、これらの呪文は、非(ネイティブでは利用できません作業 PTYモジュールを、必要cygwinの)PythonのビルドWIN32ます。
あなたがサブプロセスを制御する例の場合は、あなただけ必要な場合、それはsys.stdout.flush()
を呼び出すことができます - しかし、任意のサブプロセスのために、そのオプションは使用できません。
も参照してください。質問「なぜ、ただのパイプを使用していません(popenの())?」pexpectよくある質問でを。
所属していません StackOverflow