【发布时间】:2016-06-21 10:32:29
【问题描述】:
我正在使用Popen 运行一个进程。我需要等待进程终止。我正在检查该进程是否已通过returncode 终止。当returncode 与None 不同时,进程必须终止。问题是当print_output 是False 时returncode 总是None,即使进程已经完成运行(终止)。然而,当print_output 为True 时,情况并非如此。我正在使用以下代码来运行该过程:
def run(command, print_output=True):
# code mostly from: http://sharats.me/the-ever-useful-and-neat-subprocess-module.html
from subprocess import Popen, PIPE
from threading import Thread
from queue import Queue, Empty
from time import sleep
io_q = Queue()
def stream_watcher(identifier, stream):
for line in stream:
io_q.put((identifier, line))
if not stream.closed:
stream.close()
with Popen(command, stdout=PIPE, stderr=PIPE, universal_newlines=True) as proc:
if print_output:
Thread(target=stream_watcher, name='stdout-watcher', args=('STDOUT', proc.stdout)).start()
Thread(target=stream_watcher, name='stderr-watcher', args=('STDERR', proc.stderr)).start()
def printer():
while True:
try:
# Block for 1 second.
item = io_q.get(True, 1)
except Empty:
# No output in either streams for a second. Are we done?
if proc.poll() is not None:
break
else:
identifier, line = item
print(identifier + ':', line, end='')
Thread(target=printer, name='printer').start()
while proc.returncode is None:
sleep(2)
proc.poll()
if not proc.returncode == 0:
raise RuntimeError(
'The process call "{}" returned with code {}. The return code is not 0, thus an error '
'occurred.'.format(list(command), proc.returncode))
return proc.stdout, proc.stderr
任何可能导致此问题的线索?
编辑:发现了一些很奇怪的东西。我正在运行以下代码:
run(my_command, True)
print('--------done--------')
run(my_command, False)
print('--------done--------')
即使run(my_command, False) 被执行,'--------done--------' 也不会被打印出来。
【问题讨论】:
-
谁能重现这些问题?
标签: python subprocess