做工程时使用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在终端是能正常打印信息的。
解决方案参考:https://blog.csdn.net/cnweike/article/details/73620250。
实际上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模块接收。