Python 3 详细控制另一个进程的I/O

标签 python io subprocess pipe python-3.3

在 python 3(在 Linux 或 MacOSX10.8 上)中,如何让父进程只读取子进程发出的提示(不包括 \n),而不是整个缓冲区直到 \n?

# program names.py
print("I am Joe.")                   #1print
name = input("What is your name? ")  #2prompt
print("Hi", name, "!")               #3print

# program parent.py (in python 3.3.0)
import subprocess
import sys
p = subprocess.Popen([sys.executable, "names.py"],
                      bufsize=0,
                      stdin =subprocess.PIPE,
                      stdout=subprocess.PIPE,
                      stderr=subprocess.PIPE,
                      shell=False,
                      universal_newlines=True
                    )
print(p.stdout.readline(), end='')
p.stdin.write("Sue\n")
# The next print will produce the output of 2prompt + 3print:
print(p.stdout.readline(), end='')

当我运行 parent.py 时,它会打印:

I am Joe.
What is your name? Hi Sue !

如何修改 parent.py 以便打印:

I am Joe.
What is your name? 
Hi Sue !

即如何将prompt和print产生的输出分别提取出来?

最佳答案

readline()names.py 读取到下一个 \n,您需要的是“尽可能多地读取”就是现在”。时间在这里是一个额外的因素,因为您基本上必须检测 names.py 何时正在等待(期待输入)。

基本上,您需要一个带有超时的read() 操作。您可以启动一个单独的线程,从 names.py 中逐字节读取到缓冲区中。然后您可以join(timeout) 这个线程并访问它的缓冲区。

关于Python 3 详细控制另一个进程的I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14243401/

相关文章:

python - 锁定实体以在 Google Cloud 数据存储区中执行获取更新设置操作

c++ - 最佳文件输出缓冲区大小是多少?

Python 文件 io 缓冲

c - 如何在 C 中使用 strcmp 将用户输入与文本文件进行比较?

python - 如何使用子进程将 Ctrl 键发送到我的终端?

python-2.7 - python 子进程 popen 返回 None

python - 如何终止Python Popen创建的进程

python - ReadDirectoryChangesW无法检测和处理监视目录的删除

python - Python 中的无效 URL : No host supplied : error while using Request. get(url)

python - python 每秒发送超过 1000 个请求