我正在编写一个从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
答案 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)
你可能遇到缓冲问题 - 操作系统在到达标准输入时没有发送数据 - 请检查出来