2012-10-01 90 views
3

嗯,我有兩個腳本。如下打印出b.py腳本輸出的a.py:Popen stdout讀取管道,使用睡眠死鎖

#a.py 
from subprocess import Popen, PIPE, STDOUT 

p = Popen(['/Users/damian/Desktop/b.py'], shell=False, stdout=PIPE, stderr=STDOUT) 

while p.poll() is None: 
    print p.stdout.readline() 


#b.py 
#!/usr/bin/env python 
import time 

while 1: 
    print 'some output' 
    #time.sleep(1) 

這works.But, 爲什麼我的腳本僵局,當我取消對time.sleep()行?

+0

如果分開執行,你確定b.py不會自己死鎖嗎? (檢查縮進,如果它們對於兩條線都是相同的,則爲1:! –

回答

5

您的輸出可能被緩衝。添加.flush()標準輸出將其清除:

import sys 
import time 

while 1: 
    print 'someoutput' 
    sys.stdout.flush() 
    time.sleep(1) 
+0

事實上,flush是這樣做的,謝謝 – ScotchAndSoda

2

如果您在a.py添加-u到呼叫(使輸出緩衝),那麼你並不需要修改b.py腳本:

import sys 
from subprocess import Popen, PIPE, STDOUT 

p = Popen([sys.executable, '-u', '/Users/damian/Desktop/b.py'], 
      stdout=PIPE, stderr=STDOUT, close_fds=True) 
for line in iter(p.stdout.readline, ''): 
    print line, 
p.stdout.close() 
if p.wait() != 0: 
    raise RuntimeError("%r failed, exit status: %d" % (cmd, p.returncode)) 

more ways to get output from a subprocess

+0

很好,呵呵,還要感謝輸出的例子,再次證明了Python的強大功能。 – ScotchAndSoda