Python Subprocess Run

17 Mar 2025 | 6 分钟阅读

Python 是功能最强大的编程语言。它提供了广泛的工具和库来处理各种任务。其中一个主要工具是 subprocess 模块。它允许程序员创建新进程,连接到它们的输入/输出/错误管道,并获取它们的返回码。当程序员想在 Python 程序中执行系统命令或外部脚本时,subprocess 模块非常有用。在本文中,我们将详细探讨 Python subprocess run 函数,并解释如何使用它,并提供示例。

Subprocess 模块简介

在学习 subprocess run 函数的细节之前,让我们先了解一下 subprocess 模块是什么以及它提供了什么。subprocess 模块是 Python 标准库的一部分,它提供了一种创建新进程、连接到它们的输入/输出/错误管道以及获取其返回码的方法。该模块允许程序员在 Python 程序中执行外部程序、shell 命令和脚本。

subprocess 模块提供了几个函数,包括 call()、check_call()、check_output()、Popen() 和 run()。这些函数中的每一个都有其自己的用例和特性。然而,在 Python 3.5 或更高版本中,run() 函数是运行外部命令和脚本的推荐方法。

什么是 Subprocess Run 函数?

subprocess run() 函数是一个高级函数。它允许程序员运行一个命令或脚本,并捕获其输出、错误和返回码。run() 函数是 Popen() 函数的包装器,Popen() 函数创建新进程并连接到其输入/输出/错误管道。

run() 函数接受多个参数,包括要运行的命令、参数、输入、输出、错误、超时等。

语法

subprocess run() 函数的语法如下。

让我们详细了解每个参数

  • args: 用于运行的命令及其参数,可以是列表或字符串。
  • stdin: 用于连接到进程的输入管道。
  • input: 用于将字符串发送到进程的输入。
  • stdout: 用于连接进程的输出管道。
  • stderr: 用于连接进程的错误管道。
  • capture_output: 这是一个布尔标志,指定是否捕获进程的输出和错误。
  • shell: 这是一个布尔标志,指定是否在 shell 中运行命令。
  • cwd: 进程的当前工作目录。
  • timeout: 等待进程完成的最长时间。
  • check: 这是一个布尔标志,指定进程返回非零退出码时是否引发错误。
  • encoding: 用于输入、输出和错误管道的编码。
  • errors: 用于输入、输出和错误管道的错误处理方案。
  • text: 这是一个布尔标志,指定是否将输入、输出和错误管道视为文本还是字节。
  • env: 为进程设置的环境变量。
  • universal_newlines: 一个布尔标志,指定是否为输入、输出和错误管道使用通用换行符。

subprocess run() 的示例用法

现在我们已经了解了 subprocess run() 函数的语法和参数,让我们看看在 Python 程序中使用它的示例。

示例 1

输出

Python Subprocess Run

说明

输出显示了目录中文件占用的总块数(总共 12 个),然后是每个文件的属性。每一行包含以下信息:

  • 文件权限 (-rw-r--r--): 它指示谁可以读取、写入和执行文件。
  • 链接数 (1): 它指示文件的硬链接数。
  • 所有者 (user): 它指示文件的所有者。
  • 组 (user): 它指示文件所属的组。
  • 文件大小 (18, 112, 22): 它指示每个文件的大小(以字节为单位)。
  • 上次修改时间 (Apr 16 16:12, Apr 16 16:13, Apr 16 16:14): 它指示每个文件上次修改的时间。
  • 文件名 (file1.txt, file2.txt, file3.txt): 它指示目录中每个文件的名称。

因此,确切的输出将取决于当前目录中的文件、它们的属性以及 ls -l 命令列出的顺序。

示例 2

输出

5

说明

在上面的代码中,程序接受两个参数 2 和 3,将它们相加并返回结果 5。result.stdout 属性包含脚本的输出,为字符串“5\n”。上面的代码中的 print() 语句会将此字符串打印到控制台。\n 字符是 print() 语句自动添加的换行符。

示例 3

输出

Python Subprocess Run

说明

此代码的输出将是当前目录中所有扩展名为 .py 的文件的列表。输出的格式将类似于 Unix/Linux 终端中 ls -l 命令的输出,但只包含与 grep .py 过滤器匹配的文件。

优点

在 Python 程序中运行外部命令和脚本时,使用 Python subprocess run() 函数有很多优点。这些如下:

  1. 平台独立性: subprocess 模块是 Python 标准库的一部分,适用于所有主要操作系统,包括 Windows、Linux 和 macOS。
  2. 灵活性: subprocess run() 函数允许程序员执行各种命令和脚本,包括 shell 命令、Python 脚本和其他可执行程序。
  3. 输入/输出处理: run() 函数提供输入/输出处理功能,允许程序员捕获进程的输出和错误,并向其发送输入。
  4. 安全性: subprocess 模块提供了一种安全的方式,可以在 Python 程序中运行外部命令和脚本,从而防止常见的安全漏洞,例如命令注入攻击。
  5. 错误处理: run() 函数提供错误处理功能,允许程序员检查进程的返回码,并在进程返回非零退出码时引发错误。
  6. 集成: subprocess 模块可以与其他 Python 模块(如 os 和 sys 模块)集成,以提供更高级的功能,例如进程管理和通信。

缺点

它也有一些缺点。这些如下:

  1. 复杂性: subprocess 模块及其 run() 函数可能很难使用,尤其是对于初学者。它需要对命令行界面和系统进程有很好的理解。
  2. 安全风险: 尽管 subprocess 模块提供了一种安全运行外部命令和脚本的方法,但仍然存在潜在的安全风险,特别是如果命令或脚本来自不受信任的来源。
  3. 性能开销: 通过 subprocess 模块运行外部命令和脚本可能会引入性能开销,特别是对于大型或资源密集型程序。
  4. 缺乏交互性: run() 函数可能不适用于在执行期间需要用户输入的交互式命令或脚本。
  5. 有限的错误报告: run() 函数仅提供基本的错误报告功能,可能不足以进行高级错误处理或调试。
  6. 兼容性问题: subprocess 模块可能与某些旧版 Python 或依赖于该模块特定版本的第三方模块不兼容。

结论

在本文中,我们了解了 Python subprocess 模块和 subprocess run() 函数。我们探讨了 run() 函数的语法和参数,并看到了如何在 Python 程序中运行命令、脚本和 shell 命令。

subprocess 模块是一个强大的工具,允许程序员在 Python 程序中执行外部程序和脚本,并捕获它们的输出和返回码。