Python 逐行读取其输出时,检查子流程是否仍在运行

Python 逐行读取其输出时,检查子流程是否仍在运行,python,process,subprocess,stdin,Python,Process,Subprocess,Stdin,我正在用Python启动一个子进程,并尝试读取每一行输出。不幸的是,我找不到一个好的方法来测试我的进程是否仍然有效。标准方法似乎是检查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.pol

我正在用Python启动一个
子进程
,并尝试读取每一行输出。不幸的是,我找不到一个好的方法来测试我的进程是否仍然有效。标准方法似乎是检查
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)
总是返回


我做错了什么?

要逐行处理子流程输出,请尝试以下操作:

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

另外,不需要使用操作系统kill(proc.pid,0)。就打电话
.kill()
在生成的子进程上。您还可以调用
.wait()
等待终止,而不是立即终止进程。

您打开了一个到进程stdin的管道。它正在等待读取数据吗?不,进程只输出数据。在未来,我想增加对两个方向的支持,这就是为什么我有这样的支持。这似乎是可行的。谢谢。@KrisHarper:如果您想逐行捕获其输出,则无需检查进程是否处于活动状态。@J.F.Sebastian-Hmm因此,在您的Python 3回答中,在仍将行发送到stdout时,进程没有结束的风险?在我用这个答案回答同一个问题之前,我现在看到它推荐你的答案。@KrisHarper如果进程死了,那么(显然)它不会产生任何输出,并且一旦读取了已经缓冲的数据,循环就结束了。