質問

これは私のサブプロセスの場合:

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'
プロセスが実行中に行われるまで、

なぜreadlinecommunicateが待っていますか?標準出力をリアルタイムにサブプロセスを渡す(および変更)するための簡単な方法はありますか?

ところで、私はこれを見てきましたが、私は(それの多くを理解し、気にやりなさい)ロギング機能を必要としません。

私は、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よくある質問でを。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top