2016-04-26 11 views
1

サブプロセスモジュール(Python 2.7)を使用して、コマンドを実行して実行中の出力を処理しようとしています。Python - 長期実行サブプロセスからの出力を読み取る

私は次のようなコードしている:

process = subprocess.Popen(
    ['udevadm', 'monitor', '--subsystem=usb', '--property'], 
    stdout=subprocess.PIPE) 
for line in iter(process.stdout.readline, ''): 
    print(line) 

ただし、出力は私だけがprint文の後にsys.stdout.flush()を追加した場合でも、私はCtrl + Cの後に印刷されます。

なぜこのようなことが起こりますか、このプロセスの出力をどのように流すことができますか?

特に、このudevadm monitorコマンドは終了を意図していないため、プロセスが終了して一度に処理されるのを待つことはできません。

私はlive output from subprocess commandを見つけましたが、受け入れられた答えのアプローチは私の問題を解決しませんでした。

+0

を(http://stackoverflow.com/a/17698359/ 4279) – jfs

答えて

1

あなたはunbuffer使用することができます:[で始まる段落内のリンクを:「サブプロセスstdoutはブロックバッファリングを使用している場合」]を参照

process = subprocess.Popen(
    ["unbuffer", 'udevadm', 'monitor', '--subsystem=usb', '--property'], 
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
for line in iter(process.stdout.readline, ''): 
    print(line) 
+0

ありがとう!これは機能します。しかし、Pythonだけでこれを行う方法はありますか?私は 'expect'依存関係を避けることを好むでしょう。 –

+0

残念ながら私は方法を見ることができませんが、確かにそこにないことを意味するわけではありません、私は接続ポートを切断して再接続するといくつかの出力が表示されますが、 –

関連する問題