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开发企业微信机器人每天定时发消息的完整攻略。 一、准备工作 获取企业微信机器人的webhook地址,可以通过企业微信管理后台->应用管理->自建应用->基本信息->Webhook中获取。此处以https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=XXXXXXXX-X…

    python 2023年5月23日
    00
  • Scrapy之爬取结果导出为Excel的实现过程

    Scrapy 是一个流行的 Python 爬虫框架,可以用来爬取各种网站。其中一个实用的功能是将爬取的结果导出为 Excel 文件,便于分析和处理数据。以下是实现过程的完整攻略: 安装依赖库 要导出 Excel 文件,需要安装 openpyxl 库和 xlrd 库。可以使用 pip 命令来安装: pip install openpyxl pip instal…

    python 2023年6月2日
    00
  • python实现探测socket和web服务示例

    在Python中,我们可以使用socket库实现探测socket服务,使用requests库实现探测web服务。本文将介绍如何使用Python实现探测socket和web服务,并提供两个示例代码。 方法1:使用socket库实现探测socket服务 使用socket库实现探测socket服务是Python中最常用的方法之一。以下是示例代码的步骤: 导入必要的…

    python 2023年5月15日
    00
  • 如何使用Python获取数据库中的表列表?

    要使用Python获取数据库中的表列表,可以使用Python的内置模块sqlite3或第三方库mysql-connector-python。以下是使用mysql-connector-python获取数据库中的表列表的完整攻略: 连接数据库 要连接到数据库,需要提供数据库的主机名、用户名、和数据库名称。可以使用以下代码连接MySQL: import mysql…

    python 2023年5月12日
    00
  • Python爬虫之Selenium实现窗口截图

    下面是“Python爬虫之Selenium实现窗口截图”的攻略: 1. 安装Selenium 首先需要安装Selenium,可使用pip包管理器,输入以下命令: pip install selenium 2. 下载Chromedriver 使用Selenium需要下载浏览器驱动,这里以Chrome浏览器为例,下载对应版本的Chromedriver,在http…

    python 2023年5月14日
    00
  • 详解用Python创建透明的png图片 – pillow

    下面是使用 Python 中的 Pillow 库来创建透明 PNG 图片的完整攻略: 环境准备 在开始之前,需要确保已经安装了 Pillow 库。如果还没有安装,请通过以下命令安装: pip install pillow 创建透明 PNG 图片 创建透明的 PNG 图片其实不难,只需要在 Pillow 库中使用 Image 类的 putalpha() 方法即…

    python-answer 2023年3月25日
    00
  • Python 字符串去除空格的五种方法

    当我们使用Python处理字符串时,经常会遇到字符串中包含空格的情况。这时候,我们通常需要去除这些空格。本文将详细讲解Python字符串去除空格的五种方法。 方法一:使用strip()去除空格 strip()是Python内置的字符串方法,可以去除字符串前后的空格,代码如下: string = " hello, world! " new_…

    python 2023年6月5日
    00
  • Python打包可执行文件的方法详解

    下面是“Python打包可执行文件的方法详解”的完整攻略: 一、为什么需要打包可执行文件? Python 是一种解释型语言,直接执行 .py 文件需要先安装 Python 环境,而且还需要安装所需的依赖库。这给程序的使用和传播带来了很大的困难。因此,为了方便程序的使用和传播,我们可以将 Python 程序打包为可执行文件。这样,不需要安装 Python 环境…

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