2015-09-29 45 views
3

我正在写一个python脚本,它从stdin读取一个流,并将此流传递给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()永远不会到达。

我已经阅读了很多关于这个主题的变化,但是我不明白。任何想法缺少什么?

谢谢!

达里奥

+0

相关:[将数据流式传输到带有子进程的命令.Popen](http://stackoverflow.com/q/32662375/4279) – jfs

回答

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 

如果没有需要修改标准输入流,那么你就不需要在这里使用管道:

#!/usr/bin/env python 
import subprocess 

subprocess.check_call('sort') 
相关问题