Python: 深入理解 subprocess.run() 执行命令、检查状态与结果处理

Python: 深入理解 subprocess.run() 执行命令、检查状态与结果处理

subprocess.run() 是 Python 3 中用于执行系统命令的一个重要函数。它提供了一个简洁、强大且直观的方式来运行外部程序或系统命令,特别适用于那些需要和系统交互或者需要调用外部可执行程序的场景。在这篇文章中,我们将详细讨论如何使用 subprocess.run() 函数,特别是 check=True 的用法,以及如何处理其状态和结果。

在这里插入图片描述

1. subprocess.run() 概述

subprocess.run()subprocess 模块的一部分,它是替代旧版模块(如 os.system())的更强大且安全的方法。其主要目的是允许我们在 Python 中执行外部命令,并捕获输出、错误信息以及返回状态。

基本的语法如下:

import subprocess result = subprocess.run(command, check=True,...)

在这个语法中,command 是一个字符串或列表,用于表示要执行的系统命令。check=True 表示如果命令执行失败(即返回非零退出码),函数将抛出一个 subprocess.CalledProcessError 异常。

2. subprocess.run() 参数详解

  • command:一个列表或字符串,表示要执行的命令。使用列表形式更安全,因为它可以避免 shell 注入风险。例如 ['ls', '-l'] 而不是 'ls -l'
  • check:布尔值,默认是 False。如果设为 True,命令返回非零退出状态码时会引发 CalledProcessError 异常。这个参数非常有用,尤其是在处理必须执行成功的命令时,可以避免继续执行错误逻辑。
  • stdout:定义如何处理命令的标准输出,例如设置为 subprocess.PIPE 可以捕获输出。
  • stderr:类似于 stdout,用于处理标准错误输出。
  • text:如果设为 True,会将输出解码为字符串,否则返回字节类型。
  • capture_output:如果设为 True,则同时捕获标准输出和标准错误。

3. 一个基本例子

来看一个简单的例子:

import subprocess try: result = subprocess.run(['ls','-l'], check=True, text=True, capture_output=True)print("标准输出:", result.stdout)except subprocess.CalledProcessError as e:print("命令执行失败,错误码:", e.returncode)print("错误输出:", e.stderr)

在这个例子中:

  • 我们使用 ['ls', '-l'] 作为要执行的命令。
  • check=True 表示如果命令返回非零的状态码,程序会抛出异常。
  • text=True 会将输出解码为字符串,方便打印和处理。
  • capture_output=True 会捕获命令的输出和错误。

4. 处理命令的执行状态

当我们使用 subprocess.run() 执行命令时,可以通过以下几种方式来处理命令的状态和结果:

    • subprocess.CompletedProcess 对象的 returncode 属性存储了命令执行后的返回码。如果返回码为 0,则表示执行成功;否则表示失败。
    • check=True 时,非零的返回码会引发 subprocess.CalledProcessError 异常,这样我们就可以用 try...except 块来处理错误情况。
    • 如果希望查看命令的标准输出或标准错误,可以使用 capture_output=True 或直接设置 stdoutstderr 参数。
    • 类似于标准输出,标准错误输出可以使用 result.stderr 捕获。例如:

处理标准错误输出

try: result = subprocess.run(['ls','/nonexistent'], check=True, text=True, capture_output=True)except subprocess.CalledProcessError as e:print("错误输出:", e.stderr)

在这种情况下,如果 /nonexistent 目录不存在,错误信息会被捕获并打印出来。

捕获输出

result = subprocess.run(['echo','Hello, World!'], text=True, capture_output=True)print("标准输出:", result.stdout)

在这里,result.stdout 会包含命令的输出内容 "Hello, World!\n"

使用 check=True 处理异常

try: subprocess.run(['false'], check=True)except subprocess.CalledProcessError as e:print(f"命令执行失败,错误码: {e.returncode}")

这个例子中,false 是一个始终返回非零状态码的命令,因此会触发异常处理块。

捕获返回码

result = subprocess.run(['ls','-l'], text=True, capture_output=True)if result.returncode ==0:print("命令执行成功")else:print("命令执行失败,返回码:", result.returncode)

5. subprocess.CompletedProcess 对象

subprocess.run() 返回一个 subprocess.CompletedProcess 对象,它包含了多个属性:

  • args:执行的命令。
  • returncode:命令执行的返回码,0 表示成功,非零表示失败。
  • stdout:标准输出的内容(如果设置了 capture_output=Truestdout=subprocess.PIPE)。
  • stderr:标准错误输出的内容(如果设置了 capture_output=Truestderr=subprocess.PIPE)。

一个例子来展示这些属性:

result = subprocess.run(['echo','Python subprocess module!'], text=True, capture_output=True)print("命令:", result.args)print("返回码:", result.returncode)print("标准输出:", result.stdout)

在这个例子中,result 对象包含了所有与命令执行相关的信息,这使得它非常灵活,适用于处理各种执行情况。

6. 结论

subprocess.run() 是 Python 中一个非常有用的工具,用于与系统命令交互。通过设置不同的参数,我们可以轻松控制命令的执行、捕获其输出、检查其状态以及处理可能的错误。在使用 check=True 时,函数会自动处理失败情况,通过抛出异常的方式提醒开发者注意到命令的失败,这在编写更稳健的脚本时尤其有用。

使用 subprocess.run() 的一些最佳实践包括:

  1. 优先使用列表而不是字符串 作为命令,以避免潜在的 shell 注入风险。
  2. 结合 check=True 使用异常处理,这样可以更好地处理命令执行失败的情况。
  3. 捕获输出并处理,确保命令的输出被正确记录或用于后续逻辑。

通过这些方法,我们可以充分利用 subprocess.run() 的功能,编写高效且安全的 Python 脚本。

Read more

GitHub Copilot 调用第三方模型API

GitHub Copilot 调用第三方模型API

一、说明 OAI Compatible Provider for Copilot 的作用是:把 Copilot/Copilot Chat 发出的“类似 OpenAI API 的请求”,转发到指定的 OpenAI-Compatible 服务端(例如 ModelScope 推理网关、自建的兼容网关等)。 ⚠️ Warning 登录 GitHub Copilot 的账号一定要是非组织方式开通 pro 会员的,不然无法管理模型。 推荐直接用免费的free账号登录即可。 二、插件安装 在 VS Code 扩展市场安装并启用: * GitHub Copilot * GitHub Copilot Chat * OAI Compatible Provider for Copilot (johnny-zhao.

Paperiii 官网入口:www.paperiii.com——2026抖音爆款AI写作工具

Paperiii 官网入口:www.paperiii.com——2026抖音爆款AI写作工具

今天小编就用一篇文章说清楚在抖音播放量2千万+的2026开年抖音爆款AI写作工具——Paperiii。 一、官网在哪里? 这个是后台私信问小编最多的问题,话不多说,小编直接把官网放这里——www.paperiii.com,需要的家人们自取,也可以点击下方卡片直接跳转。 Paperiii官网http://www.paperiii.com 二、Paperiii是什么? Paperiii 是一款面向学术写作的专业 AI 辅助工具,主打全流程论文支持,且成文在知网的重复率和AI率达标,由于近期山寨仿冒网站增多,大家认准paperiii官网:https://www.paperiii.com,误入山寨仿冒网站不仅可能造成论文数据泄露,还可能被知网记录,影响后续的论文检测与提交。 三、Paperiii能做什么? 1)AI 辅助写作 2)AI 降重 + 降 AIGC 率 3)AI 智能审稿 4)AI

基于stm32的多旋翼无人机(Multi-rotor UAV based on stm32)

基于stm32的多旋翼无人机(Multi-rotor UAV based on stm32)

由于一直在调试本项目,好久没有发文章,最近本项目的PID调试初见成效!开始正文前首先感谢各位粉丝的支持,以及对本项目技术上支持的老师以及师兄,谢谢你们! 对应源码及文件:源码及文件下载 基于stm32的多旋翼无人机 * 一、多旋翼无人机飞行原理 * 1.1 多旋翼无人机的组成 * 1.1.1 电机 * 1.1.2 电调 * 1.1.3 航模电池 * 1.1.4 正反浆 * 1.2 垂直上升及下降 * 1.3 向前飞行及向后飞行 * 1.4 顺时针改变航向和逆时针改变航向 * 二、多旋翼无人机飞控电路设计 * 2.1 系统框架设计 * 2.2 主控MCU模块 * 2.3 三轴加速陀螺仪模块

Copilot 的agent、ask、edit、plan模式有什么区别

Copilot 的 ask、edit、agent、plan 四种模式,核心区别在于权限范围、操作主动性、代码修改权限、适用场景,以下从定义、工作机制、核心特点、典型场景与操作流程展开,帮你快速区分并选对模式。 一、核心区别速览(表格版) 二、分模式详细解析 1. Ask 模式:纯问答与代码理解 * 工作机制:基于当前文件 / 选中代码的上下文,回答自然语言问题,不修改任何代码,仅输出文字解释、建议或思路。 * 典型用法: * 解释某段代码逻辑(如 “这段 Python 函数做了什么”); * 咨询技术方案(如 “如何在 Go 中实现重试机制”); * 调试思路(如 “这个死循环可能的原因”)。 * 关键特点:安全无风险,适合学习、快速澄清和非修改类咨询。