我正在使用子进程模块启动子进程并连接到它的输出流(stdout).我希望能够在其标准输出上执行非阻塞读取.有没有办法让.readline非阻塞或在我调用之前检查流上是否有数据.readline?我希望这是可移植的,或至少在Windows和Linux下工作.
这是我现在如何做到的(.readline如果没有数据可用,则阻止它):
p = subprocess.Popen('myprogram.exe', stdout = subprocess.PIPE)
output_str = p.stdout.readline()
Run Code Online (Sandbox Code Playgroud) 这是运行任意命令返回其stdout数据的Python代码,或者在非零退出代码上引发异常:
proc = subprocess.Popen(
cmd,
stderr=subprocess.STDOUT, # Merge stdout and stderr
stdout=subprocess.PIPE,
shell=True)
Run Code Online (Sandbox Code Playgroud)
communicate 用于等待进程退出:
stdoutdata, stderrdata = proc.communicate()
Run Code Online (Sandbox Code Playgroud)
该subprocess模块不支持超时 - 能够终止运行超过X秒的进程 - 因此,communicate可能需要永久运行.
在旨在在Windows和Linux上运行的Python程序中实现超时的最简单方法是什么?
我有一个Linux的Python程序几乎看起来像这样:
import os
import time
process = os.popen("top").readlines()
time.sleep(1)
os.popen("killall top")
print process
Run Code Online (Sandbox Code Playgroud)
该程序挂起在这一行:
process = os.popen("top").readlines()
Run Code Online (Sandbox Code Playgroud)
这种情况发生在保持更新输出的工具中,如"Top"
我最好的考验:
import os
import time
import subprocess
process = subprocess.Popen('top')
time.sleep(2)
os.popen("killall top")
print process
Run Code Online (Sandbox Code Playgroud)
它比第一个(它被砍掉)效果更好,但它返回:
<subprocess.Popen object at 0x97a50cc>
Run Code Online (Sandbox Code Playgroud)
第二次试验:
import os
import time
import subprocess
process = subprocess.Popen('top').readlines()
time.sleep(2)
os.popen("killall top")
print process
Run Code Online (Sandbox Code Playgroud)
和第一个一样.它由于"readlines()"而被绞死
它的返回应该是这样的:
top - 05:31:15 up 12:12, 5 users, load average: 0.25, 0.14, 0.11
Tasks: 174 total, 2 running, 172 sleeping, 0 stopped, 0 zombie
Cpu(s): 9.3%us, …Run Code Online (Sandbox Code Playgroud) 我想在Python中实现一个简单的看门狗定时器,有两个用例:
x秒y秒我怎么做?
需要:
Python 3子进程模块内置了超时,我也尝试使用计时器和使用线程实现超时,但它不能与输出一起使用.readline()阻止与否?readlines()肯定会在吐出所有输出之前等待进程结束,这不是我需要的(我需要继续).
我接近切换到node.js :-(
python ×5
subprocess ×4
timeout ×2
hung ×1
io ×1
nonblocking ×1
python-3.x ×1
stdout ×1
watchdog ×1