当前位置: 首页 > 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()
http://www.dtcms.com/a/254688.html

相关文章:

  • 【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八股文——操作系统「进程篇」
  • MySQL高可用方案解析与选型指南
  • 内网攻防实战_红日靶场01
  • FPGA基础 -- Verilog函数
  • 在真实环境中对 LLM 代理进行安全评估的综合基准
  • Spring Boot(九十三):Springboot 整合cfx实现webservice接口
  • 【Computer】计算机原理大纲
  • uni-app项目实战笔记16--实现头部导航栏效果
  • 苍穹外卖--WebSocket、来单提醒、客户催单