当前位置: 首页 > 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.lryc.cn/news/572335.html

相关文章:

  • 永磁同步电机无速度算法--基于正切函数锁相环的滑模观测器
  • 【鸿蒙HarmonyOS Next App实战开发】​​​​ArkUI纯色图生成器
  • VACM 详解:SNMPv3 的访问控制核心
  • 回溯----8.N皇后
  • C++ std::set的用法
  • 根据图片理解maven
  • FocalAD论文阅读
  • SpringBoot 应用开发核心分层架构与实战详解
  • SpringBoot电脑商城项目--修改默认收货地址
  • 计算机网络:(四)物理层的基本概念,数据通信的基础知识,物理层下面的传输媒体
  • Mac电脑-Office 2024 长期支持版(Excel、Word、PPT)
  • 【数据破茧成蝶】企业数据标准:AI时代的智能罗盘与增长基石
  • 探索大语言模型(LLM):Lora vs. QLora:参数高效微调的双生花,你该选谁?
  • 协作式机器人助力提高生产速度和效益
  • Java泛型详解与阿里FastJSON源码中的巧妙运用
  • 生成式 AI 的发展方向,应当是 Chat 还是 Agent?
  • 华为OD机试-MELON的难题-DFS(JAVA 2025A卷)
  • 【QT】TXT电子书语音朗读器开发
  • 《Whisper :说明书 》
  • 智能家居HA篇 二、配置Home Assistant并实现外部访问
  • Kafka存储设计深度剖析:日志、索引与文件管理的底层奥秘
  • 【Dify 案例】【自然语言转SQL案例】【三】【工具】【自然语言转SQL】
  • 14.7 LangChain三阶训练法:揭秘智能阅读系统如何用动态难度调节实现92%题目准确率
  • 使用springboot实现过滤敏感词功能
  • Linux文件I/O系统调用深度解析
  • C++ 面向对象特性详解:继承机制
  • 【AI作画】第2章comfy ui的一般输入节点,文本框的类型和输入形式
  • F接口基础.go
  • P2066 机器分配
  • 八字排盘小游戏微信流量主小程序开源