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

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日

相关文章

  • python函数中将变量名转换成字符串实例

    将Python函数中的变量名转换为字符串实例是比较常见的操作,一般使用内置函数str()或repr()就能完成。 下面是详细的步骤及示例说明: 步骤一:通过locals()或globals()获取函数内部的变量,返回一个字典类型的变量locals/globals_dict。 步骤二:遍历字典,将变量名加入到一个列表中。 步骤三:使用列表中的变量名构建变量的字…

    python 2023年6月5日
    00
  • Python中的匿名函数使用简介

    当我们在使用Python编程时,有时候我们只需要定义一个简单的函数,这个函数可能只会被使用一次,那么此时使用匿名函数就显得非常方便。 什么是匿名函数 在Python中,匿名函数也被称为lambda函数,是一种临时的,只能在一处使用的函数,通常用于需要一个函数,但是又不想特意为之创建一个函数的情况。 匿名函数的语法形式如下: lambda args: expr…

    python 2023年6月5日
    00
  • Python创建一个自定义视频播放器的实现

    下面我会详细介绍一下如何在 Python 中创建一个自定义的视频播放器。 步骤一:安装必要的库 首先,我们需要安装一些必要的库来播放视频文件。这包括: OpenCV:一个计算机视觉库,支持Python。用于处理视频流和图像。 使用pip命令来安装:pip install opencv-python Pygame:一个用于创建游戏和多媒体应用的Python库。…

    python 2023年6月5日
    00
  • Python入门教程(二十)Python的Lambda表达式

    下面是详细的Python入门教程(二十)Python的Lambda表达式完整攻略。 什么是Lambda表达式 Lambda表达式,也称为匿名函数,是一种简洁、快速、内联定义函数的方法。Lambda表达式可以代替一些不必要的函数定义,使代码更加简洁易读。 Lambda表达式的语法结构如下: lambda argument_list: expression 其中…

    python 2023年6月5日
    00
  • C++调用python(执行py文件)的全过程

    C++调用Python脚本文件的过程中,需要使用Python的外部库Python.h。在执行Python脚本文件前,需要先建立Python的运行环境,即调用Py_Initialize()函数进行初始化,完成后即可使用Python的相关功能了。 下面详细讲解在C++中调用Python脚本的全过程: 引用Python库以及头文件 在C++中引用Python库和头…

    python 2023年5月13日
    00
  • pip报错“ValueError: invalid literal for int() with base 10: ‘2.4’”怎么处理?

    当使用pip安装Python包时,可能会遇到“ValueError: invalid literal for int() with base 10: ‘2.4’”错误。这个错误通常是由以下原因之一引起的: 版本号格式不正确:如果版本号格式不正确,则可能会出现此错误。在这种情况下,需要更改版本号格式。 包依赖关系不正确:如果包依赖关系不正确,则可能会出现此错误…

    python 2023年5月4日
    00
  • Pandas sample随机抽样的实现

    下面我为您详细讲解“Pandas sample随机抽样的实现”的完整攻略。 什么是Pandas sample随机抽样? 在数据分析领域,经常需要对数据集进行抽样分析,Pandas作为数据分析库,提供了sample方法来实现对数据集的抽样操作。Pandas sample方法可以从DataFrame中获取指定样本数量的数据,同时也支持获取指定比例的数据。 sam…

    python 2023年6月3日
    00
  • Python实现自动计算特定格式的时间差

    当计算时间差需要频繁进行时,手动计算会变得繁琐和容易出错。为了方便进行时间差的计算,Python提供了实用的datetime模块。使用该模块可以轻松实现自动计算特定格式的时间差。 下面是完整攻略步骤: 1. 导入datetime模块 要使用datetime模块,必须先导入它。在Python中,使用import语句实现: import datetime 2. …

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