python:輸出subprocess中子程序的執行資訊
阿新 • • 發佈:2018-12-10
做工程時使用subprocess模組時,遇到子程序的執行資訊無法輸出的情況。
如test.py:
import time
for i in range(5):
print i
time.sleep(1)
使用subprocess模組如下:
import subprocess cmd = 'python /home/cabin/Desktop/test.py' p=subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,executable="/bin/bash") while p.poll() is None: line = p.stdout.readline() line = line.strip() if line: print('stdout info: [{}]'.format(line)) if line: time.sleep(10) print('process:success') break try: p.kill() except OSError: pass
理論上在line接收到test.py的執行資訊後,加10s延時列印程式執行成功,p模組。實際執行中會發現p並沒有接收到任何test.py的執行資訊,line值實際上是為None,迴圈一直無法退出,而單獨執行test.py在終端是能正常列印資訊的。
實際上subprocess模組中stdout所接收的執行資訊不是print打印出來的資訊,而應該是標準的輸出資訊,同理,stderr接收的是標準的錯誤資訊。在python中應為sys.stdout.write以及sys.stderr.write。故test.py應改為如下形式:
import time for i in range(5): sys.stdout.write(i) sys.stdout.flush() time.sleep(1)
其中sys.stdout.flush()為手動清空標準輸出的存,使得test.py的資訊能實時被subprocess模組接收。