【问题标题】:Python - a subprocess writing to stdin so that the main program can read it from the stdinPython - 写入标准输入的子进程,以便主程序可以从标准输入读取它
【发布时间】:2011-12-30 07:31:48
【问题描述】:

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

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

【问题讨论】:

  • 为什么不让一个程序完成所有工作?您仍然可以将其拆分为多个文件。你知道 Python 中的模块是如何工作的吗?
  • 告诉我们你到目前为止做了什么。
  • @KarlKnechtel :我正在编写一个虚拟机,所以我不应该这样做。我的意思是虚拟机规范就像我上面所说的应该使用另一个程序来完成它!跨度>
  • 你不能写信给stdin。为什么不改用pipes?

标签: python stdin


【解决方案1】:

第一个程序应该从一个文件(或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)

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

【讨论】:

  • 这很有用!但是请检查我的编辑..我添加了代码..如果您的建议有任何更改,请告诉我!请 !!谢谢!
  • 没问题!我更新了答案。正如我在答案中解释的那样,您不需要在 Python 代码中创建子进程。让他们像往常一样从标准输入读取并写入标准输出。 shell 将完成剩下的工作。
  • 就像枪声一样简单,伙计!有点期待技术性,但是对我来说已经足够了!!再次感谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 2015-08-14
  • 2019-12-05
  • 2012-01-18
相关资源
最近更新 更多