Python 与子流程的交互

Python 与子流程的交互,python,multithreading,subprocess,Python,Multithreading,Subprocess,我正在尝试自动运行一个名为selftest.exe的程序,该程序完成后,会要求用户按[ENTER]退出。因此,通过subprocess.Popen调用此进程是不起作用的,因为它将永远挂起,直到用户按下[ENTER],他永远不会这样做 虽然我认为不可能在准确的时间发送按键,但我考虑了一个超时,比如“在XXX秒后发送”\n“并将进程的标准输出存储在字符串中”,XXX的大小足以让我获得所有结果 这是一个可行的想法,还是有一个“更干净”的想法来处理交互式程序 解决方案:第一个答案是正确的,只要按ente

我正在尝试自动运行一个名为
selftest.exe
的程序,该程序完成后,会要求用户按
[ENTER]
退出。因此,通过
subprocess.Popen
调用此进程是不起作用的,因为它将永远挂起,直到用户按下
[ENTER]
,他永远不会这样做

虽然我认为不可能在准确的时间发送按键,但我考虑了一个超时,比如“在XXX秒后发送”\n“并将进程的标准输出存储在字符串中”,XXX的大小足以让我获得所有结果

这是一个可行的想法,还是有一个“更干净”的想法来处理交互式程序


解决方案:第一个答案是正确的,只要按enter键,程序就会退出。但是,调用
p.communicate(input='\n')
将导致以下错误:'str'不支持缓冲区接口。它需要是
p.communicate(input=b'\n')

也许这是一个愚蠢的问题,您可能已经这样做了,但是您确定简单地将“\n”发送到流程将不起作用吗?我想说的是,
selftest.exe
在完成之前可能不会真正读取
[ENTER]
。当然,这取决于程序如何读取enter。您也可以尝试发送
SIGQUIT
SIGTERM
,因此程序可能会优雅地处理它们

你试过了吗?Windows不支持POSIX信号(C要求的6除外)。因此,对于任何
signum
os.kill(pid,signum)
,除了
signal.CTRL\u C\u事件
signal.CTRL\u BREAK\u事件
,只需尝试一个粗略的
终止过程
。这一点也不优雅,你说得对。当我写这篇文章时,我忘记了用户在Windows中(这在
.exe
文件中很明显),对此表示抱歉。