python - 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
解决方案
让子进程重定向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
推荐阅读
- flutter - 在 flutter_webview 中监听 url 重定向
- c# - Asp.net core 5 / Odata v8 实现(控制器不返回 Odata 类型)作为响应
- flutter - 如何在网站平台上跟踪 URL
- python - 在循环中将 where 应用于不同的列集的更有效方法 - python
- python - 如何将差异中的值复制到实际金额列
- telethon - 协助修复 Telethon 刮板代码,总是返回错误
- phpunit - 如何在文本输出中获得简单的 phpunit 代码覆盖率摘要?
- python - 有没有一种混合错误处理和上下文管理的pythonic方法?
- numpy - 使用 sklearn 对 MNIST 数据集进行手写数字识别
- reactjs - NextJs - 链接以滚动到同一页面中的某个部分