我有一个从stdin获取输入的python程序。现在,我要编写另一个程序并将其作为子进程调用,这样每次启动此子进程时,它应该从另一个文本文件读取数据并将其写入stdin,然后我的主程序从stdin读取并使用它。
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()
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
答案 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)
这些示例适用于行(如果您使用的是文本文件,则会更好)。您可以轻松地逐字节执行相同操作。