读取数据流并传递给子进程

3
我正在编写一个Python脚本,它从标准输入流中读取数据,并将这个流传递给subprocess进行进一步处理。问题在于,在处理完输入流后,Python会挂起。

例如,这个玩具程序sorter.py应该从标准输入中读取数据,并通过Unix sort将数据流传递给subprocess进行排序:

cat dat.txt | ./sorter.py

下面是sorter.py的代码:
#!/usr/bin/env python

import subprocess
import sys

p= subprocess.Popen('sort -', stdin= subprocess.PIPE, shell= True)
for line in sys.stdin:
    p.stdin.write(line)
sys.exit()

cat 命令输出的流已经正确排序,但程序卡住了,也就是说 sys.exit() 没有被执行。

我已经阅读了很多类似的变体,但仍然不能解决问题。有没有什么遗漏的地方?

谢谢!

Dario


2个回答

1
我猜测:当程序执行到 sys.exit() 时,sort 命令仍在运行。您应该关闭 p.stdin 管道以向 sort 发送 EOF 信号。
#!/usr/bin/env python2
import subprocess
import sys

p = subprocess.Popen('sort', stdin=subprocess.PIPE, bufsize=-1)
with p.stdin:
    for line in sys.stdin:
        # use line here
        p.stdin.write(line)
if p.wait() != 0:
    raise Error

例子:

$ < dat.txt ./sorter.py

如果您不需要修改stdin流,则无需在此处使用PIPE:
#!/usr/bin/env python
import subprocess

subprocess.check_call('sort')

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接