我正在尝试为一段代码编写一些基本测试,这些代码通常会不间断地通过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()
调用后挂起?
答案 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")
但是要注意:您不能确定子进程结束之前输出管道中是否包含任何内容...