Python - 子进程写入stdin以便主程序能从stdin读取

5 投票
1 回答
2644 浏览
提问于 2025-04-17 09:15

我有一个用Python写的程序,它从标准输入(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 个回答

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)

这些示例是按行处理的(如果你在处理文本文件,这样更好)。你也可以很容易地按字节处理。

撰写回答