我正在写一个包装脚本为选择性地接受来自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))
它的工作原理,但不是很高效利用内存。 谁能想到一个更好的解决方案? 也许一种方式来分割或复制流?
附加约束:
- 该子只能被调用一次。 因此,我不能一次读取一行,处理它,并将其转发给子进程。
- 该解决方案必须在Python 2.6工作