读取流并传递给子流程

时间:2015-09-29 15:43:35

标签: python subprocess stdin

我正在编写一个从stdin读取流的python脚本,并将此流传递给subprocess以进行进一步处理。问题是python在处理完输入流后会挂起。

例如,这个玩具程序sorter.py应该从stdin读取并将流传递给subprocess以便通过Unix sort进行排序:

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 个答案:

答案 0 :(得分:1)

我猜:到达sys.exit()sort继续运行。您应关闭p.stdin管道以向EOF发信号通知sort

#!/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')

答案 1 :(得分:0)

你可能遇到缓冲问题 - 操作系统在到达标准输入时没有发送数据 - 请检查出来

https://www.turnkeylinux.org/blog/unix-buffering