python subprocess pipe 实时输出日志的操作

yizhihongxing

Python 的 subprocess 模块提供了与系统进程进行交互的能力,允许我们在 Python 中启动新进程并与其进行通信。当我们启动一个子进程时,有时候需要实时输出子进程的日志信息,这就需要用到 subprocess 模块中的 pipe 和实时输出函数(如: poll、communicate等)。

下面是实时输出子进程日志信息的完整攻略:

  1. 使用 subprocess.Popen 启动子进程。
import subprocess
proc = subprocess.Popen(['command', 'arg1', 'arg2'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  1. 在子进程执行过程中,使用 communicate() 函数等待子进程执行结束,并实时输出子进程的日志信息。另外,使用 poll() 函数判断子进程是否结束。
while True:
    output = proc.stdout.readline()
    if output == '' and proc.poll() is not None:
        break
    if output:
        print(output.strip())
    output = proc.stderr.readline()
    if output == '' and proc.poll() is not None:
        break
    if output:
        print(output.strip())
retval = proc.poll()

在实时输出日志的过程中,我们发现每条日志输出时都带有一个换行符号,这是因为 readline 函数会读取到换行符然后输出。

下面是一个简单的示例,该示例会启动一个子进程并调用它打印程序的版本信息。

import subprocess

proc = subprocess.Popen(['python', '-V'], stdout=subprocess.PIPE)

while True:
    output = proc.stdout.readline()
    if output == '' and proc.poll() is not None:
        break
    if output:
        print(output.strip())

retval = proc.poll()

下面是另一个更完整的示例,该示例将在 Python 程序中启动一个 Shell 子进程并循环输出子进程的日志信息,直到子进程执行结束。

# -*- coding: utf-8 -*-

import subprocess
import sys

if len(sys.argv) < 2:
    print('Usage: python run_subprocess.py <command>')
    sys.exit(1)

try:
    proc = subprocess.Popen(
        sys.argv[1:],
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        universal_newlines=True
    )

    while True:
        # Read stdout and stderr
        output = proc.stdout.readline() + proc.stderr.readline()

        if output == '' and proc.poll() is not None:
            break

        if output:
            print(output.strip())

    retval = proc.wait()

    print('RETVAL:', retval)

except OSError as e:
    # Handle OSError
    pass

这个示例中,我们在命令行中运行了一个参数化的命令,并使用 subprocess.Popen 对其进行处理。将 stdout 和 stderr 设置为 subprocess.PIPE,表示我们要从子进程中获取输出。然后,我们开始循环,读取 stdout 和 stderr,直到子进程结束。最后,我们打印子进程的返回值。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python subprocess pipe 实时输出日志的操作 - Python技术站

(0)
上一篇 2023年6月5日
下一篇 2023年6月5日

相关文章

  • windows下安装Python的XlsxWriter模块方法

    下面是”windows下安装Python的XlsxWriter模块方法”的完整实例教程: 确定Python版本 在安装XlsxWriter之前,需要先确定Python版本。可以打开命令行,输入以下代码查看Python版本: python –version 如果Python版本是2.x,就需要安装XlsxWriter的1.x版本;如果Python版本是3.x…

    python 2023年5月13日
    00
  • 教你用Python实现简易版学生信息管理系统(含源码)

    教你用Python实现简易版学生信息管理系统(含源码) 概述 本文将介绍如何使用 Python 编写一个简单的学生信息管理系统。本系统支持添加、查询、删除和修改学生信息,并且所有数据都存储在本地文本文件中。本文将详细介绍系统的实现流程,并提供完整的源码。 实现步骤 1. 创建项目 首先,在本地环境中创建一个新的 Python 项目文件夹,并在文件夹中创建一个…

    python 2023年5月30日
    00
  • python 删除excel表格重复行,数据预处理操作

    当我们处理Excel表格数据的时候,常常遇到需要删除相同的行的情况,这时我们就需要进行数据预处理。接下来我将使用Python语言进行Excel表格数据的预处理操作,通过本文的介绍,您可以轻松掌握Python处理Excel表格数据的方法。 环境准备 在开始操作前,需要先安装pandas包。您可以使用以下命令进行安装: pip install pandas 数据…

    python 2023年5月13日
    00
  • Python输入二维数组方法

    下面是详细讲解“Python输入二维数组方法”的完整攻略: 方法一:使用嵌套列表 我们可以使用嵌套列表的方式,将二维数组的每一行都表示为一个列表元素,然后将所有这样的行列表组成一个大的列表。以下是具体的步骤: 定义一个空列表,用于存储所有的行列表。 使用一个 for 循环,遍历输入的所有行。 在每次遍历中,创建一个空列表,用于保存当前行的所有元素。 使用另一…

    python 2023年6月5日
    00
  • Python制作简易计算器功能

    关于Python制作简易计算器的攻略,我可以如下进行讲解: 制作简易计算器功能 实现原理 通过Python中的基本运算符和控制流程语句,结合Python中强大的字符串和数值计算能力,实现一个简易的计算器功能。 示例代码1 # 实现两数相加的计算器 # 获取用户输入 num1 = input("输入第一个数字:") num2 = input…

    python 2023年5月19日
    00
  • 解决pyqt5异常退出无提示信息的问题

    解决 PyQt5 异常退出无提示信息的问题攻略 问题描述: 使用 PyQt5 开发软件时,程序在运行过程中异常退出,但是没有任何提示信息或错误信息,导致无法判断和解决问题,这给程序的测试和维护带来了很大的困难。 解决方法: PyQt5 提供了一个名为 QCoreApplication 的类,通过使用该类中的 setAttribute 方法将 Qt 库设置为线…

    python 2023年5月13日
    00
  • 详解如何在Python中做Hash加密

    在Python中进行Hash加密可以使用内置的hashlib模块,该模块提供了多种Hash算法,我们可以根据需要选择使用的算法进行加密。 下面是具体操作步骤: 导入hashlib模块 import hashlib 使用hashlib模块中的函数进行加密 对于任何需要加密的数据,我们首先需要将其编码为二进制形式,然后使用hashlib模块中的相应函数对其进行加…

    python-answer 2023年3月25日
    00
  • python标准库模块之json库的基础用法

    当我们需要在不同的技术栈之间交换数据时,我们需要一种简便易行的方式,以确保数据格式的一致性。在Python中,JSON(JavaScript Object Notation)是一种流行的格式,它被广泛用于数据交换,因为它易于阅读和理解,并且它的轻量性可以轻松地处理大量数据。Python中有一个标准库模块json库专门用于JSON的编码和解码。 基本用法 js…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部