首页 > 解决方案 > Python 3 子进程模块 - 超时命中后返回控制台输出

问题描述

我有下面的代码启动一个可执行文件,并在它完成执行后等待来自 shell 的响应。我有 60 秒的超时设置。如果可执行文件在 60 秒内完成工作,则该变量streamdata是一个字符串,其中包含您以交互方式运行可执行文件时将打印到控制台屏幕的内容。

但是,如果达到超时截止,则 的值streamdata似乎只是一个空白的二进制字符串。我该如何修改,以便在超时杀死 .exe 后仍然获得 STDOUT?

startupinfo = None
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
            
process = subprocess.Popen([<parameters>], stdout=subprocess.PIPE, startupinfo=startupinfo)
process2 = process.pid
streamdata = process.communicate(timeout=60)[0]
streamdata2 = streamdata.decode(errors='replace')
rc = process.returncode

标签: pythonpython-3.xsubprocess

解决方案


让子进程重定向stdout到一个文件(或其他东西),然后读取它。例如:

import subprocess
import os
program_path="E:/Project2.exe"
file_path="E:/1.txt"
if os.path.exists(file_path):
    os.remove(file_path)

startupinfo = None
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
with open(file_path,'w') as f:
    process = subprocess.Popen([program_path],stdout=f, startupinfo = startupinfo)
process2 = process.pid
try:
    streamdata = process.communicate(timeout=2)[0]
except Exception:
    print("Time Out!")
    with open(file_path, 'r') as f:
        print(f.readlines())
    process.kill()

输出:

Time Out!
['1\n', '1\n', '1\n', '1\n', '1\n', '1\n', '1\n', '1\n', '1\n', '1\n', '1\n', '1\n', '1\n', '1\n', '1\n', '1\n', '1\n', '1\n', '1\n', '1\n']

如果您想获得尽可能多的输出,请stdout在子进程中更频繁地刷新。

如果您只需要在控制台中查看输出:

startupinfo = None
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
            
process = subprocess.Popen([<parameters>],startupinfo=startupinfo)#<-here is the difference
process2 = process.pid
streamdata = process.communicate(timeout=60)[0]
streamdata2 = streamdata.decode(errors='replace')
rc = process.returncode

推荐阅读