![](/img/trans.png)
[英]Python read stdin from piped process and from Popen subprocess simultaneously
[英]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))
哪个有效,但效率不高。 谁能想到更好的解决方案? 也许是分割或复制流的方法?
附加限制:
这对你有用吗?
#!/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.