Python - 写入stdin的子进程,以便主程序可以从stdin读取它

时间:2011-12-30 07:31:49

标签: python stdin

我有一个从stdin获取输入的python程序。现在,我要编写另一个程序并将其作为子进程调用,这样每次启动此子进程时,它应该从另一个文本文件读取数据并将其写入stdin,然后我的主程序从stdin读取并使用它。

out.py:

from subprocess import Popen, PIPE, STDOUT

import os

import sys

def read():
    p = Popen(['python', 'in.py'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)

    out = p.communicate()

    print out[0]

def main():
    read()

if __name__ == "__main__":
    main()

in.py:

import sys,os

import subprocess

def main():

    f = open("ad.txt","r")

    for line in f:
        print line

if __name__ == "__main__":
    main()

基本上我的问题是in.py读取整个文件并打印到我不想要的STDOUT中,而不应该只传达一个字符。如果ad.txt如下:

asdfgh

我应该"a"然后"s"然后"d"然后"f" ..等等..每次我调用函数时逐个字符读取下一个字符应该读取文件。这就是事情!唷!请帮助我,我有一项工作要做!提前致谢:D

1 个答案:

答案 0 :(得分:6)

第一个程序应该从文件(或stdin)读取并写入stdout(不是stdin)。同样,第二个程序应该从stdin读取并写入stdout。现在,您可以使用管道符号在命令行中将它们粘合在一起:

python first.py | python second.py

就是这样!没有一个程序必须知道另一个;这就是使用“流水线”的美妙。

附录:Shell管道工作在缓冲区上工作。 shell侦听第一个程序并使用其输出填充缓冲区。同时,只要有东西要读,第二个程序就会从缓冲区中读取,否则它会等待。通信是同步的,只需要固定大小的内存。

示例代码:

# first.py
import sys
for line in open("input.txt"):
    processed_line = process_line(line)
    sys.stdout.write(processed_line)

# second.py
import sys
for line in sys.stdin:
    processed_line = process_line(line)
    sys.stdout.write(processed_line)

这些示例适用于行(如果您使用的是文本文件,则会更好)。您可以轻松地逐字节执行相同操作。