【问题标题】:Reading from and writing to process using subprocess使用子进程读取和写入进程
【发布时间】:2025-12-19 18:40:17
【问题描述】:

我一直(未成功)尝试使用 Python 的 subprocess 模块与可执行程序进行交互。该程序是一个非常简单的基于命令行的脚本。

它基本上只是以以下方式起作用:提示用户文本,等待数字输入,提示更多文本,等待下一个输入等。

所以我这样设置子流程

from subprocess import Popen, PIPE
p = Popen('filename.exe', stdin=PIPE, stdout=PIPE)

然后我得到第一个提示

print p.stdout.readline()

正确返回

输入一些值等等等等

太棒了!然后我尝试输入所需的值

p.stdin.write('10.0')

然后它完全挂起。我可以尝试抓住下一个提示

print p.stdout.readline()

但无论如何它仍然挂起。

进行这一行读/写业务的正确方法是什么?我想我一定搞砸了write 行。

【问题讨论】:

    标签: python io subprocess


    【解决方案1】:

    您可能忘记输出换行符:

    p.stdin.write('10.0\n')
    

    发生的情况是您的子进程正在接收数据,但正在等待更多输入,直到找到换行符。如果您在此状态下等待进程的输出,则会导致系统死锁。

    【讨论】:

    • @Cyber​​:不要觉得自己很愚蠢。直接使用阻塞p.stdin/p.stdout很容易死锁。 \n 可能还不够;你可能需要os.linesep,或者你可能需要p.stdin.flush()。明确地将bufsize 设置为Popen。它在不同的 Python 版本上有不同的默认值。另外,你怎么知道p.stdout.readline() 就够了。如果答案是两行怎么办?理想情况下,如果可以,即当输入不依赖于输出时,请使用p.communicate(input)。子进程也可以在 stdout/stderr 之外写入,例如直接写入终端。你可以使用pexpect