有许多与 Python 子进程和执行期间读取 stdout 相关的问题和答案,但我仍然没有找到满足这些要求的解决方案:
- 启动子进程
- 将标准输出打印到终端,同时进行其他处理,例如写入文件
- 将 stderr 打印到终端,同时进行其他处理,例如写入文件
- stdout 和 stderr 必须分开处理
- 如果输出指示错误或由于某些超时终止进程
- 必须支持 Linux,如果可能还支持 Windows (XP/7)
一个障碍是,例如,如果正在运行的进程没有生成标准输出数据,则进程 stdout.read() 和 stdout.readline() 将阻塞,从而防止进程 kill() 由于超时而终止。
代码开始:
# Python 3.3 syntax
import sys
import subprocess
def subproc(args, stdout):
proc = subprocess.Popen(args, stdout=subprocess.PIPE, shell=False, universal_newlines=True)
while True: # while is broken by return
try:
outs = '' # Clear before communication attempt
outs = proc.communicate(timeout=1)[0] # Timeout every second to process stdout
except subprocess.TimeoutExpired:
pass
# Processing termination using proc.kill is added later
sys.__stdout__.write('Shows that proc communicate timeout works\n')
if outs:
stdout.write(outs) # Allow stdout processing
if proc.returncode is not None: # Completed execution
return proc.returncode # End while and return
class StdHandle:
def write(self, str):
# Additional processing ...
sys.__stdout__.write(str)
def flush(self):
pass
rc = subproc(('proc.sh'), stdout=StdHandle())
print('Return code:', rc)
# EOF