HOWTO · Python
Python 中的 subprocess.check_output
本教程讨论 Python 中 subprocess.check_output 函数的使用,重点在于执行 Git 命令。通过实用示例,学习如何自动化任务、检索信息并提升工作流程效率。了解如何检查当前分支、列出远程以及检查仓库的状态,同时将 Python 与 Git 无缝集成。
本页内容
subprocess.check_output() 会以你提供的参数运行程序,并返回其标准输出。将参数以列表形式传入,即可在不构建 shell 命令字符串的情况下捕获命令的结果。
在 Python 中使用 subprocess.check_output()
当你的脚本需要命令的输出,且应将非零退出状态视为失败时,请使用 subprocess.check_output()。该函数是 Python subprocess 模块的一部分;它不会并行运行命令。
语法与返回行为
简略的调用形式为 subprocess.check_output(args, *, cwd=..., timeout=..., text=None, ...);这并不是完整的函数签名。args 提供命令及其参数。cwd、timeout 和 text 为关键字参数:cwd 选择子进程的工作目录,timeout 限制调用等待的时间,text 控制捕获的输出是否解码为文本。text 的默认值为 None,因此除非启用文本模式,否则输出为字节。完整的 API 参考请参阅 Python subprocess 文档。
默认情况下,返回值为字节。当你需要 Python 字符串时,请将其解码。使用 text=True 时,Python 会替你解码捕获的输出。这个紧凑的示例让 Python 解释器打印固定的一行,捕获其字节,将其以 UTF-8 解码,并把该行写入标准输出。
import subprocess
import sys
output = subprocess.check_output(
[sys.executable, "-c", "print('ready')"]
)
print(output.decode("utf-8"), end="")
ready
参数列表使可执行文件与其参数保持分离。例如 subprocess.check_output(["git", "status"]) 这样的调用会捕获当前目录中 Git 的标准输出。
使用 subprocess.check_output() 运行 Git 命令
请在你想要检查的仓库中运行这些调用。若要读取当前分支,请使用 subprocess.check_output(["git", "rev-parse", "--abbrev-ref", "HEAD"], text=True).strip()。当仓库处于分离 HEAD(detached HEAD)状态时,Git 会报告 HEAD,而不是分支名称。
若要列出已配置的远程及其 URL,请使用 subprocess.check_output(["git", "remote", "-v"], text=True)。若要查看已暂存、未暂存和未跟踪的更改,请使用 subprocess.check_output(["git", "status"], text=True)。这些命令取决于 Git 已安装,且当前工作目录位于目标仓库内;需要时,请将 cwd 设置为该仓库路径。
处理错误并在 check_output() 和 run() 之间选择
如果子进程以非零状态退出,subprocess.check_output() 会引发 CalledProcessError。其 returncode 记录退出状态,其 output 属性包含捕获到的标准输出。标准错误默认不会被捕获;如果你想将它与标准输出合并,请传入 stderr=subprocess.STDOUT。
参数列表不需要 shell。避免通过 shell=True 将不受信任的输入传给命令,因为 shell 的解释可能允许命令注入;仅靠 shell 引号并不是通用的安全修复方法。
对于捕获输出并将失败的退出视为错误这项专注的任务,请选择 subprocess.check_output()。当你还需要 CompletedProcess、对标准流有更多控制,或需要选择如何处理退出状态时,请选择 subprocess.run()。例如,subprocess.run(args, capture_output=True, text=True, check=False) 会返回状态和捕获到的流,供你的代码检查。