2016-09-25 10 views
2

私は2つのスクリプトを持っています。 (コードは次のとおりです)。最初のスクリプトは、遅延を伴う数字の印刷です。Python:出力するたびにサブプロセスの出力を取得し、終了しない方法

2番目のスクリプトは、最初のスクリプトをサブプロセスとして開始し、最初のスクリプトが数字を出力している場合はバックグラウンド(!)をチェックインし、そうであれば印刷します。

しかし、私が得るのは、最初のスクリプトが終了すると(20秒後)、各瞬間に1つの数字ではなく、すべての数字を一度に印刷するということです。

START 
0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
16:05:51 
OVER 

しかし、私は期待してのようなものです:: 出力は次のようである

START 
0 
16:05:51 
1 
16:05:53 
2 
16:05:55 
3 
16:05:57 
4 
16:05:59 
5 
16:06:01 
6 
16:06:03 
7 
16:06:05 
8 
16:06:07 
9 
16:06:09 
OVER 

どのように私はこの問題を解決することができますか?

コード:

1.py:

import time 
for i in range(10): 
    print(i) 
    sys.stdout.flush() 
    time.sleep(2) 

test.py:

from subprocess import Popen, PIPE, STDOUT 
from time import strftime 
import threading, sys 

stream = Popen(['python', '1.py'], stdout=PIPE, stderr=STDOUT) 
def a(): 
     while True: 
      try: 
       out = stream.communicate()[0].decode("utf-8") 
       print(out, strftime("%H:%M:%S")) 
       sys.stdout.flush() 
      except ValueError: 
       print('OVER') 
       break 
      except: 
       raise 
t = threading.Thread(target=a,) 
t.start() 
print('START') 
+0

この場合は 'communicate()'を使用する代わりに 'stream.stdout'をループします – mata

+0

@mata どちらも動作しません。最初のスクリプトが完了するのを待ってから、すべてをすぐに出力します。 –

+0

_also_は、最初のスクリプトで出力を定期的にフラッシュすることを確認する必要があります。 – mata

答えて

0

がそれぞれプリントアウトした後

sys.stdout.flush() 

呼び出して試してみてください!

あなたは基本的にバッファに書き込んでいますが、それらの書き込みは書き込みプロセスが完了するまで "フラッシュされ"ません!したがって、Pythonインタプリタ(またはその下のOS)が "それは時間をフラッシュするとき"になるまで待たずに... "手動で"そのステップを強制する必要があります!

他の背景情報についてはanswerを参照してください。

EDIT:おそらくあなたはその2番目のスクリプトを呼び出すための方法を持っている:あなたが言うように、これはストリームで作業されていないよう。代わりにpexpectモジュールをお試しください。これは、stdout出力との "対話"の "唯一の"目的のために存在します!

+0

動作しません。 'stream.communicate()[0]'のように、サブプロセスが終了するのを待っています。 'print(out、strftime("%H:%M:%S "))'は実行されていません。 –

関連する問題