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实现定时任务利器之apscheduler使用详解

    Python实现定时任务利器之apscheduler使用详解

    在Python中,还可以用第三方包来管理定时任务,比如celery、apscheduler。相对来说apscheduler使用起来更简单一些,这里来介绍一下apscheduler的使用方法
    2022-10-10
  • python2 与 pyhton3的输入语句写法小结

    python2 与 pyhton3的输入语句写法小结

    这篇文章主要给大家介绍了关于python2 与 pyhton3的输入语句写法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • selenium python浏览器多窗口处理代码示例

    selenium python浏览器多窗口处理代码示例

    这篇文章主要介绍了selenium python浏览器多窗口处理代码示例,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Django继承自带user表并重写的例子

    Django继承自带user表并重写的例子

    今天小编就为大家分享一篇Django继承自带user表并重写的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • YOLOv5改进系列之增加小目标检测层

    YOLOv5改进系列之增加小目标检测层

    yolov5出来已经很长时间了,所以有关yolov5的一些详细介绍在这里就不一一介绍了,下面这篇文章主要给大家介绍了关于YOLOv5改进系列之增加小目标检测层的相关资料,需要的朋友可以参考下
    2022-09-09
  • Python使用re模块验证危险字符

    Python使用re模块验证危险字符

    这篇文章主要介绍了如何基于python验证危险字符,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Python自动扫雷实现方法

    Python自动扫雷实现方法

    这篇文章主要介绍了Python自动扫雷实现方法,提供了Python实现自动扫雷的代码思路并备有注释说明,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • pycharm使用conda创建的虚拟环境时找不到python.exe解决办法

    pycharm使用conda创建的虚拟环境时找不到python.exe解决办法

    这篇文章主要给大家介绍了关于pycharm使用conda创建的虚拟环境时找不到python.exe的解决办法,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考价值,需要的朋友可以参考下
    2024-03-03
  • Python类的用法实例浅析

    Python类的用法实例浅析

    这篇文章主要介绍了Python类的用法,以实例形式简单分析了Python中类的定义、构造函数及使用技巧,需要的朋友可以参考下
    2015-05-05
  • Python数据可视化之画图

    Python数据可视化之画图

    今天小编就为大家分享一篇关于Python数据可视化之画图,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01

最新评论