• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

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

    发布者: 天下网吧 | 发布时间: 2025-6-17 08:14| 查看数: 78| 评论数: 0|帖子模式

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


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

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

    2. subprocess.run() 参数详解


      1. command
      复制代码
      :一个列表或字符串,表示要执行的命令。使用列表形式更安全,因为它可以避免 shell 注入风险。例如
      1. ['ls', '-l']
      复制代码
      而不是
      1. 'ls -l'
      复制代码

      1. check
      复制代码
      :布尔值,默认是
      1. False
      复制代码
      。如果设为
      1. True
      复制代码
      ,命令返回非零退出状态码时会引发
      1. CalledProcessError
      复制代码
      异常。这个参数非常有用,尤其是在处理必须执行成功的命令时,可以避免继续执行错误逻辑。
      1. stdout
      复制代码
      :定义如何处理命令的标准输出,例如设置为
      1. subprocess.PIPE
      复制代码
      可以捕获输出。
      1. stderr
      复制代码
      :类似于
      1. stdout
      复制代码
      ,用于处理标准错误输出。
      1. text
      复制代码
      :如果设为
      1. True
      复制代码
      ,会将输出解码为字符串,否则返回字节类型。
      1. capture_output
      复制代码
      :如果设为
      1. True
      复制代码
      ,则同时捕获标准输出和标准错误。

    3. 一个基本例子

    来看一个简单的例子:
    1. import subprocess

    2. try:
    3.     result = subprocess.run(['ls', '-l'], check=True, text=True, capture_output=True)
    4.     print("标准输出:", result.stdout)
    5. except subprocess.CalledProcessError as e:
    6.     print("命令执行失败,错误码:", e.returncode)
    7.     print("错误输出:", e.stderr)
    复制代码
    在这个例子中:

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

    4. 处理命令的执行状态

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

    • 捕获返回码

        1. subprocess.CompletedProcess
        复制代码
        对象的
        1. returncode
        复制代码
        属性存储了命令执行后的返回码。如果返回码为
        1. 0
        复制代码
        ,则表示执行成功;否则表示失败。
      1. result = subprocess.run(['ls', '-l'], text=True, capture_output=True)
      2. if result.returncode == 0:
      3.     print("命令执行成功")
      4. else:
      5.     print("命令执行失败,返回码:", result.returncode)
      复制代码
    • 使用
      1. check=True
      复制代码
      处理异常


        1. check=True
        复制代码
        时,非零的返回码会引发
        1. subprocess.CalledProcessError
        复制代码
        异常,这样我们就可以用
        1. try...except
        复制代码
        块来处理错误情况。
      1. try:
      2.     subprocess.run(['false'], check=True)
      3. except subprocess.CalledProcessError as e:
      4.     print(f"命令执行失败,错误码: {e.returncode}")
      复制代码
      这个例子中,
      1. false
      复制代码
      是一个始终返回非零状态码的命令,因此会触发异常处理块。

    • 捕获输出

      • 如果希望查看命令的标准输出或标准错误,可以使用
        1. capture_output=True
        复制代码
        或直接设置
        1. stdout
        复制代码
        1. stderr
        复制代码
        参数。
      1. result = subprocess.run(['echo', 'Hello, World!'], text=True, capture_output=True)
      2. print("标准输出:", result.stdout)
      复制代码
      在这里,
      1. result.stdout
      复制代码
      会包含命令的输出内容
      1. "Hello, World!\n"
      复制代码


    • 处理标准错误输出

      • 类似于标准输出,标准错误输出可以使用
        1. result.stderr
        复制代码
        捕获。例如:
      1. try:
      2.     result = subprocess.run(['ls', '/nonexistent'], check=True, text=True, capture_output=True)
      3. except subprocess.CalledProcessError as e:
      4.     print("错误输出:", e.stderr)
      复制代码
      在这种情况下,如果
      1. /nonexistent
      复制代码
      目录不存在,错误信息会被捕获并打印出来。


    5. subprocess.CompletedProcess 对象
    1. subprocess.run()
    复制代码
    返回一个
    1. subprocess.CompletedProcess
    复制代码
    对象,它包含了多个属性:

      1. args
      复制代码
      :执行的命令。
      1. returncode
      复制代码
      :命令执行的返回码,0 表示成功,非零表示失败。
      1. stdout
      复制代码
      :标准输出的内容(如果设置了
      1. capture_output=True
      复制代码
      1. stdout=subprocess.PIPE
      复制代码
      )。
      1. stderr
      复制代码
      :标准错误输出的内容(如果设置了
      1. capture_output=True
      复制代码
      1. stderr=subprocess.PIPE
      复制代码
      )。
    一个例子来展示这些属性:
    1. result = subprocess.run(['echo', 'Python subprocess module!'], text=True, capture_output=True)
    2. print("命令:", result.args)
    3. print("返回码:", result.returncode)
    4. print("标准输出:", result.stdout)
    复制代码
    在这个例子中,
    1. result
    复制代码
    对象包含了所有与命令执行相关的信息,这使得它非常灵活,适用于处理各种执行情况。

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

    • 优先使用列表而不是字符串 作为命令,以避免潜在的 shell 注入风险。
    • 结合
      1. check=True
      复制代码
      使用异常处理,这样可以更好地处理命令执行失败的情况。
    • 捕获输出并处理,确保命令的输出被正确记录或用于后续逻辑。
    通过这些方法,我们可以充分利用
    1. subprocess.run()
    复制代码
    的功能,编写高效且安全的 Python 脚本。
    到此这篇关于Python中subprocess.run()执行命令、检查状态与结果处理的文章就介绍到这了,更多相关Python subprocess.run()详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:https://www.jb51.net/python/339857skl.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表