从标准输入读取并转发给Python中的子(Read from stdin AND forward i

2019-09-28 10:00发布

我正在写一个包装脚本为选择性地接受来自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工作

Answer 1:

这是否为您工作?

#!/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


文章来源: Read from stdin AND forward it to a subprocess in Python