在不等待结果的情况下将输入发送到python子流程

在不等待结果的情况下将输入发送到python子流程,python,subprocess,popen,Python,Subprocess,Popen,我试图为一段代码编写一些基本测试,该代码通常通过stdin无休止地接受输入,直到给出一个特定的exit命令 我想检查程序是否在被给予一些输入字符串时崩溃(经过一段时间的处理),但似乎无法弄清楚如何发送数据,也无法等待我不关心的输出 我当前的代码如下所示(使用cat作为程序示例): 如何修改此选项以允许程序继续轮询,而不是在communicate()调用后挂起?我想我理解您的要求。如果知道某个现有命令会使程序崩溃,可以使用subprocess.Popen.wait(),它仍然会阻塞,但它会返回输出

我试图为一段代码编写一些基本测试,该代码通常通过stdin无休止地接受输入,直到给出一个特定的exit命令

我想检查程序是否在被给予一些输入字符串时崩溃(经过一段时间的处理),但似乎无法弄清楚如何发送数据,也无法等待我不关心的输出

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


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

我想我理解您的要求。如果知道某个现有命令会使程序崩溃,可以使用
subprocess.Popen.wait()
,它仍然会阻塞,但它会返回输出消息的元组以及与之相关的错误(如果有)

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

这在我处理子流程时非常有用:
您可以在函数中设置超时。超时后,进程仍在运行,我认为,但您必须对其进行测试,您仍然可以使用Communication发送输入

从文档中:

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

如果超时过期,则不会终止子进程,因此 正确清理一个行为良好的应用程序应该杀死这个孩子 处理并完成沟通:


您在这里使用的
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")
但是请注意:您不能确定输出管道在子流程结束之前是否包含任何内容

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")