Python中的subprocess模块用法及注意事项详解

 更新时间:2025年05月19日 09:55:00   作者:何曾参静谧  
这篇文章主要介绍了Python中subprocess模块用法及注意事项的相关资料,Python subprocess模块用于运行外部命令,支持run()和Popen()方法,提供输入输出管理、环境变量设置等高级功能,需要的朋友可以参考下

前言

在Python编程中,经常需要执行外部命令或脚本。Python标准库中的subprocess模块提供了丰富的功能,允许你启动新的进程、连接到它们的输入/输出/错误管道,并获取它们的返回码。本文将详细介绍subprocess模块的使用方法,包括基本用法、高级功能以及一些注意事项。

一、基本用法

1.1 使用subprocess.run()

subprocess.run()是Python 3.5及以上版本中引入的一个高级接口,用于运行子进程并等待其完成。它返回一个CompletedProcess实例,其中包含进程的返回码、标准输出和标准错误输出。

import subprocess

result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print(f'Return code: {result.returncode}')
print(f'Output:\n{result.stdout}')
print(f'Error:\n{result.stderr}')
  • capture_output=True:捕获标准输出和标准错误输出。
  • text=True:将输出解码为字符串(在Python 3.7及更高版本中可用,之前版本需要手动解码)。

1.2 使用subprocess.Popen()

subprocess.Popen()提供了更灵活的方式来启动和管理子进程。它返回一个Popen对象,允许你与子进程进行更复杂的交互。

import subprocess

process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
stdout, stderr = process.communicate()
print(f'Return code: {process.returncode}')
print(f'Output:\n{stdout}')
print(f'Error:\n{stderr}')
  • stdout=subprocess.PIPE 和 stderr=subprocess.PIPE:将标准输出和标准错误输出重定向到管道中,以便后续读取。
  • communicate():等待进程结束,并获取标准输出和标准错误输出。

二、高级功能

2.1 管理输入和输出

你可以通过Popen对象的stdinstdoutstderr属性与子进程进行交互。

import subprocess

process = subprocess.Popen(['grep', 'pattern'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True)
output, error = process.communicate(input='line with pattern\nanother line\n')
print(f'Return code: {process.returncode}')
print(f'Output:\n{output}')
print(f'Error:\n{error}')
  • input参数:向子进程的stdin写入数据。

2.2 设置环境变量

你可以通过env参数为子进程设置环境变量。

import subprocess
import os

env = os.environ.copy()
env['MY_VAR'] = 'my_value'
result = subprocess.run(['printenv', 'MY_VAR'], env=env, capture_output=True, text=True)
print(result.stdout)

2.3 捕获子进程的输出而不阻塞

你可以使用Popen对象的stdoutstderr文件的readline()read()方法来逐步读取输出,而不是一次性等待所有输出完成。

import subprocess

process = subprocess.Popen(['ls', '-l', '/some/large/directory'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)

while True:
    line = process.stdout.readline()
    if not line:
        break
    print(line.strip())

process.wait()  # 等待进程结束

三、注意事项

  • 安全性:避免直接执行不受信任的输入,以防止命令注入攻击。使用列表形式的命令和参数,而不是字符串拼接。

  • 跨平台兼容性:不同操作系统上的命令和路径可能有所不同。确保你的代码在目标平台上进行测试。

  • 资源管理:确保在不再需要时关闭子进程的管道和文件描述符,以避免资源泄漏。

  • 错误处理:检查子进程的返回码,并根据需要处理标准错误输出中的错误信息。

四、总结

subprocess模块是Python中处理外部命令和脚本的强大工具。通过subprocess.run()subprocess.Popen(),你可以以灵活和强大的方式启动和管理子进程。掌握这些工具将使你能够编写更加复杂和健壮的Python程序。

到此这篇关于Python中的subprocess模块用法及注意事项的文章就介绍到这了,更多相关Python中subprocess模块详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python实现实时监控文件的方法

    python实现实时监控文件的方法

    这篇文章主要为大家详细介绍了python实现实时监控文件的3种方法,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • pytest参数化:@pytest.mark.parametrize详解

    pytest参数化:@pytest.mark.parametrize详解

    pytest.mark.parametrize装饰器能够对测试函数进行参数化处理,使得一个测试函数可以用多组数据执行多次,这有助于检查不同输入下的期望输出是否匹配,提高测试的效率和覆盖率,装饰器可以应用于函数、模块或类,支持多个装饰器组合使用,增强测试的灵活性和综合性
    2024-10-10
  • Python实现在数字中添加千位分隔符的方法小结

    Python实现在数字中添加千位分隔符的方法小结

    在数据处理和数据可视化中,经常需要对大数值进行格式化,其中一种常见的需求是在数字中添加千位分隔符,本文为大家整理了三种常见方法,希望对大家有所帮助
    2024-01-01
  • Python getopt模块处理命令行选项实例

    Python getopt模块处理命令行选项实例

    这篇文章主要介绍了Python getopt模块处理命令行选项实例,本文讲解相对简单,需要的朋友可以参考下
    2014-05-05
  • 将自己的数据集制作成TFRecord格式教程

    将自己的数据集制作成TFRecord格式教程

    今天小编就为大家分享一篇将自己的数据集制作成TFRecord格式教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • 如何使用Python异步之上下文管理器

    如何使用Python异步之上下文管理器

    这篇文章主要为大家介绍了如何使用Python异步之上下文管理器详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • python实现阶乘的三种方法

    python实现阶乘的三种方法

    阶乘是基斯顿·卡曼于 1808 年发明的运算符号,是数学术语,一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1,本文给大家介绍了python实现阶乘的三种方法,通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • Python如何求取逆序数

    Python如何求取逆序数

    这篇文章主要介绍了Python如何求取逆序数问题,具有很好的参考价值,希望大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 浅谈如何测试Python代码

    浅谈如何测试Python代码

    今天带大家了解如何用Python测试代码,文中有非常详细的介绍及代码示例,对正在学习的小伙伴们很有帮助,需要的朋友可以参考下
    2021-06-06
  • Python2.7.10以上pip更新及其他包的安装教程

    Python2.7.10以上pip更新及其他包的安装教程

    今天小编就为大家分享一篇Python2.7.10以上pip更新及其他包的安装教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06

最新评论