与子进程多次通信

6 投票
1 回答
3391 浏览
提问于 2025-04-16 02:36

我正在尝试将输入传递给一个在Python中以子进程形式打开的程序。使用communicate()可以实现我想要的效果,但它只能执行一次,然后会等子进程结束后才继续进行。

有没有类似于communicate()的方法或模块,可以和子进程进行多次交流呢?

这里有个例子:

import subprocess

p = subprocess.Popen('java minecraft_server.jar',
                 shell=True,
                 stdin=subprocess.PIPE);

//Pipe message to subprocess console here

//Do other things

//Pipe another message to subprocess console here

如果能有更简单的方法,不用subprocess也可以,那就更好了。

1 个回答

7

你可以多次对 p.stdin 进行 write 操作(每次都要 flush 一下,以确保数据真的发送出去)。问题只在于你想要确保能收到结果的时候(因为让其他进程不缓存它们的输出是很难的!),但既然你在 Popen 类里根本没有设置 stdout=,那显然这对你来说不是问题。(当这确实是个问题,而你又需要打破其他进程的输出缓存策略时,pexpect 或者在 Windows 上的 wexpect 是最好的解决方案。我在 stackoverflow 上经常推荐它们,但现在手头没有链接,所以如果你真的有这个需求,请自己搜索一下,尽管这和你的例子相反。)

撰写回答