Python 使用subprocess实时获取输出

Python 使用subprocess实时获取输出

在本文中,我们将介绍如何使用Python中的subprocess模块获取实时输出。subprocess模块是一个用于创建新进程并与其进行交互的强大工具。它提供了一个功能丰富的接口,可以在Python脚本中执行外部命令,并获取其实时输出。

阅读更多:Python 教程

subprocess模块简介

subprocess模块是Python标准库中的一部分,它提供了创建和管理子进程的方法,可以在Python脚本中执行外部命令。

subprocess模块提供了多种方法来执行外部命令,并在脚本中获取其实时输出。其中,最常用的方法是使用subprocess.Popen函数。Popen函数可以用于创建一个子进程,并与其进行交互。

下面是一个使用subprocess模块获取实时输出的简单示例:

import subprocess

# 执行外部命令
cmd = ['ls', '-l']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

# 获取实时输出
for line in iter(p.stdout.readline, b''):
    print(line.decode('utf-8').strip())

# 等待命令执行完成
p.wait()
Python

上述示例中,我们首先创建一个Popen对象,传入需要执行的外部命令和相关参数。然后,我们使用stdout参数将命令的标准输出重定向到一个管道中。在获取实时输出时,我们使用stdoutreadline方法读取每一行输出,并将其编码为UTF-8格式的字符串。

实时输出示例

下面是一个更复杂的示例,演示了如何使用subprocess模块获取实时输出并对其进行处理:

import subprocess
import sys

# 执行外部命令
cmd = ['ping', 'www.google.com']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

# 获取实时输出并处理
for line in iter(p.stdout.readline, b''):
    sys.stdout.write(line.decode('utf-8'))
    sys.stdout.flush()

# 等待命令执行完成
p.wait()
Python

在上述示例中,我们执行了一个ping命令,并将其实时输出打印到屏幕上。为了实现实时输出,我们使用了sys.stdout.writesys.stdout.flush方法,将每一行输出立即显示在屏幕上。

非阻塞模式实时输出

除了上述示例中的阻塞模式外,subprocess模块还提供了一种非阻塞模式获取实时输出的方法。我们可以使用select模块来实现非阻塞模式。

下面是一个使用非阻塞模式获取实时输出的示例:

import subprocess
import sys
import select

# 执行外部命令
cmd = ['ping', 'www.google.com']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

# 获取实时输出并处理
while True:
    # 使用select函数检查stdout是否有输出
    readable, _, _ = select.select([p.stdout.fileno()], [], [], 0.1)
    if p.stdout.fileno() in readable:
        line = p.stdout.readline()
        print(line.decode('utf-8').strip())
    else:
        break

# 等待命令执行完成
p.wait()
Python

在上述示例中,我们使用select函数来检查子进程的标准输出是否有数据可读。如果有数据可读,则使用readline方法获取实时输出并进行处理。如果没有数据可读,则表示命令已经执行完成,跳出循环。

总结

本文介绍了如何使用Python中的subprocess模块获取实时输出。subprocess模块提供了多种方法来执行外部命令,并在脚本中获取其实时输出。我们可以使用Popen函数创建子进程,并使用stdout参数重定向命令的标准输出到一个管道中,然后使用readline方法获取实时输出。此外,我们还介绍了使用非阻塞模式获取实时输出的方法。无论是阻塞模式还是非阻塞模式,subprocess模块都是处理外部命令输出的有力工具。

希望本文能够帮助你理解和应用subprocess模块,并在实际开发中发挥作用。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册