2016-03-07 57 views
1

我正在Python中启动subprocess并尝试读取每行输出。不幸的是,如果我的流程仍然存在,我无法找到一个好的测试方法。标准方法似乎在检查poll(),但似乎总是返回None。这是我的代码。检查子进程在按行读取其输出行时是否仍在运行

proc = Popen(sys.argv[1:], stdin=PIPE, stdout=PIPE, stderr=STDOUT) 

while True: 
    process_line(proc.stdout.readline().decode('utf-8')) 

    if not proc.poll(): 
     break 

for line in proc.communicate()[0].splitlines(): 
    process_line(line.decode('utf-8')) 

我使用os.kill(proc.pid, 0),这适用于非生成的进程也尝试过,但似乎Python会在进程启动这样os.kill(proc.pid, 0)总是返回的句柄。

我在做什么错?

+0

您打开了一个管道到进程的stdin。它是否在等待读取数据? –

+0

否该过程仅输出数据。将来我想增加对两个方向的支持,这就是为什么我在那里。 –

回答

1

处理由线路子输出线,尝试:

p = subprocess.Popen(cmd, stdout=subprocess.PIPE, bufsize=1) 
while p.poll() is None: 
    line = p.stdout.readline() 
    ...do something with the line here 

通知我将缓冲区大小设置为1。

也,不需要os.kill(proc.pid, 0)。只需在您生成的子流程中调用 .kill()即可。您也可以致电.wait()等待终止,而不是立即终止进程。

+1

这似乎工作。谢谢。 –

+0

@KrisHarper:如果你想逐行捕获它的输出,那么*不需要*来检查进程是否还活着。 – jfs

+0

@ J.F.Sebastian嗯所以在你的Python 3的答案在这里http://stackoverflow.com/a/17698359/817630,当线仍然被发送到标准输出时,没有风险的过程结束?之前我使用这个答案http://stackoverflow.com/a/2716032/817630对同一个问题,但我现在看到它建议你的。 –

相关问题