1. 程式人生 > >python:輸出subprocess中子程序的執行資訊

python:輸出subprocess中子程序的執行資訊

    做工程時使用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模組接收。