当前位置: 首页 > news >正文

实时输出subprocess.Popen运行程序的日志

实时输出subprocess.Popen运行程序的日志,因为readline会阻塞,所以开启两个线程分别接受标准输出和标准错误

import logging
import os
import subprocess
import sys
import threading
import timelogging.basicConfig(level=logging.INFO)class ProcessLogRecorder(threading.Thread):def __init__(self, proc, is_stderr=False, log_name="", sleep_secs=0.2):super().__init__()self._proc = procself._is_stderr = is_stderrself._stream = self._proc.stderr if is_stderr else self._proc.stdoutself._log = logging.getLogger(log_name)self._sleep_secs = sleep_secsself._running = threading.Event()self._running.set()def work(self):while self._running.is_set() and self._proc.poll() is None:line = self._stream.readline()if not line:time.sleep(self._sleep_secs)if self._is_stderr:self._log.error(line)else:self._log.info(line)def stop(self):self._running.clear()def run(self):try:self.work()except Exception as ex:print(ex)class ManageSingleServer:@staticmethoddef start_server():cmd = ['ping', 'www.baidu.com']cmd = ["timeout", "/t", "5"]proc = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True)stdout_recorder = ProcessLogRecorder(proc)stderr_recorder = ProcessLogRecorder(proc, True)stdout_recorder.start()stderr_recorder.start()return proc, stdout_recorder, stderr_recorder@classmethoddef run(cls):proc, stdout_recorder, stderr_recorder = cls.start_server()try:for i in range(20):print(proc.poll(), stdout_recorder.is_alive())time.sleep(2)except KeyboardInterrupt:print("Ctrl+C pressed")proc.terminate()proc.wait()stdout_recorder.stop()stderr_recorder.stop()sys.exit(0)if __name__ == "__main__":ManageSingleServer.run()

相关文章:

  • 【mongoose8.x】mongoose8.x入门教程(一):windows环境安装篇
  • XML重复查询一条Sql语句??怎么解决
  • Outlook邮箱开通发信服务及OAuth2验证开通
  • Vim:从入门到进阶的高效文本编辑器之旅
  • 利用DevEco Studio对RK3588的HiHopesOS-4.1.110(OpenHarmony)进行Qt程序编写
  • Web 应用防火墙(WAF)工作原理、防护策略与部署模式深度剖析
  • web布局04
  • 输入url之后发生了什么
  • 226. 翻转二叉树
  • Clickhouse源码分析-Replicated Database创建流程
  • Spring Boot + MyBatis + Vue:打造高效全栈应用的黄金组合
  • NodeJS 对接 Outlook 发信服务器实现发信功能
  • 专题:2025游戏科技与市场趋势报告|附130+份报告PDF汇总下载
  • KungfuBot——基于物理约束的人形全身控制PBHC,用于学习高动态技能打拳或跳舞(即RL下的动作模仿和运控)
  • go客户端ssh交换机
  • SpringBoot 应用开发核心分层架构与实战详解
  • 一款功能强大的专业CSV编辑工具
  • Java的SpringAI+Deepseek大模型实战
  • 【鸿蒙HarmonyOS Next App实战开发】​​ArkUI时钟界面实现解析:动态双模式时钟与沉浸式体验​
  • CppCon 2017 学习:Effective Qt: 2017 Edition
  • 网站维护提示/武汉网站制作
  • 网建设门户网站/中山做网站推广公司
  • java .net做网站/宁波seo网络推广渠道介绍
  • 做白酒的网站/福州网站优化
  • 网站建设公司知乎/seo服务价格表
  • 昭通做网站/网络营销做得好的公司