【问题标题】:Read stream and pass to subprocess读取流并传递给子进程
【发布时间】:2015-12-27 04:36:23
【问题描述】:

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

例如,这个玩具程序sorter.py 应该从标准输入读取并将流传递给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()。

我已经阅读了很多关于这个主题的变体,但我无法正确理解。知道缺少什么吗?

谢谢!

达里奥

【问题讨论】:

标签: python subprocess stdin


【解决方案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

如果你不需要修改标准输入流那么你不需要在这里使用 PIPE:

#!/usr/bin/env python
import subprocess

subprocess.check_call('sort')

【讨论】:

    【解决方案2】:

    您可能在缓冲方面遇到问题 - 操作系统不会在数据到达标准输入的那一刻发送数据 - 检查一下

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

    【讨论】:

      猜你喜欢
      • 2019-05-26
      • 2018-05-12
      • 2019-12-26
      • 2019-03-15
      • 2019-05-24
      • 1970-01-01
      • 2014-06-22
      • 2021-06-29
      相关资源
      最近更新 更多