将输入发送到python子进程而无需等待结果

时间:2018-09-26 05:10:16

标签: python subprocess popen

我正在尝试为一段代码编写一些基本测试,这些代码通常会不间断地通过stdin接受输入,直到给出特定的退出命令为止。

我想检查程序是否在输入一些输入字符串后崩溃(经过一段时间处理后),但是似乎无法弄清楚如何发送数据并且不会卡住以等待输出不在乎。

我当前的代码如下(使用cat作为程序示例):

myproc = subprocess.Popen(['cat'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

myproc.communicate(input=inputdata.encode("utf-8"))
time.sleep(0.1)

if myproc.poll() != None:
    print("not running")
else:
    print("still running")

如何修改此设置以允许程序继续进行轮询,而不是在communicate()调用后挂起?

3 个答案:

答案 0 :(得分:1)

所以我想我明白你在这里想要什么。如果您知道会导致程序崩溃的现有命令,则可以使用“ subprocess.Popen.wait()”,它仍然会阻塞,但会返回输出消息的元组以及与之相关的错误(如果有)。

然后,您可以记录该错误并将其捕获在try异常语句中。

当我处理子流程时,这真的很有帮助: https://docs.python.org/3/library/asyncio-subprocess.html

答案 1 :(得分:1)

您可以在Popen.communicate(input=None, timeout=None)函数中设置超时。超时后,该进程仍在运行,我认为,但您必须对其进行测试,仍然可以通过通信发送输入。

从文档中

  

如果进程在超时秒后仍未终止,则将引发TimeoutExpired异常。捕获此异常并重试通信不会丢失任何输出。

     

如果超时到期,子进程不会被杀死,所以为了   正确清理行为良好的应用程序应该杀死孩子   处理并完成沟通:

答案 2 :(得分:1)

此处使用communicate的错误工具正在等待程序结束。您应该只提供子流程的标准输入:

myproc = subprocess.Popen(['cat'], stdin=subprocess.PIPE, stdout=subprocess.PIPE,
                          stderr=subprocess.PIPE)
myproc.stdin.write(inputdata.encode("utf-8"))

time.sleep(0.1)

if myproc.poll() != None:
    print("not running")
else:
    print("still running")

但是要注意:您不能确定子进程结束之前输出管道中是否包含任何内容...