Python - 子进程向stdin写入,使主程序可以从stdin读取

5
我有一个从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
为什么不只使用一个程序完成所有工作呢?你仍然可以将其分割成几个文件。你知道 Python 中的模块是如何工作的,对吧? - Karl Knechtel
展示一下你目前为止做了什么。 - RanRag
@KarlKnechtel:我正在编写一个虚拟机,所以我不应该这样做...我的意思是,虚拟机规范就像它应该使用另一个程序来完成,就像我之前说的那样! - VoodooChild92
1
你无法写入stdin。为什么不使用管道呢? - Some programmer dude
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)

这些示例可以逐行工作(如果您正在使用文本文件,则更好)。您也可以轻松地逐字节进行相同的操作。


很有用!但请查看我的编辑..我添加了代码..如果您对建议有任何更改,请告诉我!拜托了!谢谢! - VoodooChild92
1
没问题!我更新了答案。正如我在答案中所解释的那样,您不需要在Python代码内部创建子进程。让它们像往常一样从stdin读取并写入stdout。剩下的交给shell处理即可。 - Eser Aygün
简单易懂,伙计!虽然我有点期望会更加技术性一些,但对我来说已经足够好了!再次感谢! - VoodooChild92

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接