与子流程的交互

时间:2014-11-10 15:27:55

标签: python multithreading subprocess

我正在使用PolarSSL库,并希望自动化一些测试。 PolarSSL提供了一个命令行可执行文件(selftest.exe),它可以自动执行大量测试,但我想将它与我的Python程序连接起来。基本上,我想阅读其输出并将其存储为字符串以供进一步调查。

然而,当selftest.exe完成后,它会要求用户按[ENTER]退出程序,因此,通过subprocess.Popen调用此过程不起作用,因为它永远挂起直到用户按下[ENTER],这是他永远不会的。

虽然我认为在合适的时间发送击键是不合理的,但我想到了超时,比如“在XXX秒之后,发送”\ n“并将进程的标准输出存储在一个字符串“,其中XXX足以让我获得所有结果。

这是一个可行的想法,还是有一个“更清洁”的想法来处理一般的交互式程序?

编辑(由于声誉不佳,我无法发表评论):第一个答案是正确的,只要按下回车,程序就会退出。但是,调用p.communicate(input='\n')会导致以下错误:'str'不支持缓冲区接口。您需要拨打p.communicate(input=b'\n')

1 个答案:

答案 0 :(得分:1)

也许这是一个愚蠢的问题,你可能已经这样做了,但是你确定只是发送了" \ n"这个过程不会起作用吗?我会说selftest.exe可能在[ENTER]完成后才真正阅读SIGQUIT。当然,这取决于程序如何读取输入。您也可以尝试发送SIGTERM或{{1}},因此可能该程序将优雅地处理它们。