繁体   English   中英

从stdin读取并将其转发到Python中的子进程

[英]Read from stdin AND forward it to a subprocess in Python

我正在为一个程序编写一个包装脚本,该脚本可选择接受来自STDIN的输入。 我的脚本需要处理文件的每一行,但它还需要将STDIN转发到它正在包装的程序。 在极简主义的形式,这看起来像这样:

import subprocess
import sys

for line in sys.stdin:
    # Do something with each line
    pass

subprocess.call(['cat'])

请注意,我实际上并没有尝试包装cat ,它只是作为一个示例来演示是否正确转发STDIN。

通过上面的例子,如果我注释掉for循环,它就可以正常工作。 但是,如果我使用for循环运行它,则没有任何内容被转发,因为我已经读到了STDIN的末尾。 我不能seek(0)到文件的开头,因为你不能在流上寻找。

一种可能的解决方案是将整个文件读入内存:

import subprocess
import sys

lines = sys.stdin.readlines()
for line in lines:
    # Do something with each line
    pass

p = subprocess.Popen(['cat'], stdin=subprocess.PIPE)
p.communicate(''.join(lines))

哪个有效,但效率不高。 谁能想到更好的解决方案? 也许是分割或复制流的方法?

附加限制:

  1. 子进程只能调用一次。 因此,我不能一次读取一行,处理它,并将其转发到子流程。
  2. 该解决方案必须在Python 2.6中运行

这对你有用吗?

#!/usr/bin/env python2
import subprocess
import sys

p = subprocess.Popen(['cat'], stdin = subprocess.PIPE)

line = sys.stdin.readline()

####################
# Insert work here #
####################

line = line.upper()

####################

p.communicate(line)

例:

$ echo "hello world" | ./wrapper.py 
HELLO WORLD

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM