我正在尝试自动运行一个名为 selftest.exe
的程序,该程序完成后会要求用户按 [ENTER]
退出。因此,通过 subprocess.Popen
调用此进程不起作用,因为它会永远挂起,直到用户按下 [ENTER]
,而用户永远不会按下 [ENTER]
。
虽然我认为不可能在正确的时间发送击键,但我考虑了超时,例如“XXX秒后,发送“\n”并将进程的标准输出存储在一个字符串”,XXX足够大,足以让我获得所有结果。
这是一个可行的想法,还是有一个“更干净”的想法可以与一般的交互式程序一起使用?
解决方案:第一个答案是正确的,只要按回车键,程序就会退出。但是,调用 p.communicate(input='\n')
将导致以下错误:'str' 不支持缓冲区接口(interface)。它需要改为 p.communicate(input=b'\n')
。
最佳答案
也许这是一个愚蠢的问题,并且您可能已经这样做了,但是您确定简单地将“\n”发送到进程不会起作用吗?我想说的是,selftest.exe
在完成之前可能不会真正读取 [ENTER]
。当然,这取决于程序如何读取输入。您也可以尝试发送 SIGQUIT
或 SIGTERM
,因此也许程序会妥善处理它们。
关于python - 与子流程交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26847130/