在 Python 中,subprocess
模块提供了灵活的方法来创建新进程、连接到它们的输入/输出/错误管道,并获取它们的返回码。在许多情况下,我们需要从 Python 脚本中执行系统命令,并检查其执行状态。subprocess.run()
函数是 subprocess
模块中一个常用的接口,用于执行外部命令。
subprocess.run()
的基本用法
subprocess.run()
在 Python 3.5 中被引入,是执行命令的高级接口。它的基本语法如下:
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False)
args
: 要执行的命令及其参数,可以是字符串或序列。stdin
,stdout
,stderr
: 分别是标准输入、输出和错误流。shell
: 如果为True
,命令将在 shell 中执行。timeout
: 超时时间,单位为秒。check
: 如果为True
,当进程返回非零状态码时,将会引发subprocess.CalledProcessError
异常。
执行示例
以下是一个简单的示例,我们将执行一个 shell 命令并获取其输出:
import subprocess
# 执行 shell 命令
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
# 检查命令的返回码
if result.returncode == 0:
print("命令执行成功!")
print("命令输出:")
print(result.stdout) # 输出命令的标准输出
else:
print("命令执行失败,错误信息:")
print(result.stderr) # 输出命令的标准错误
在这个示例中,我们使用 ls -l
命令列出当前目录下的文件。我们通过 capture_output=True
来捕获标准输出和标准错误流,并将 text=True
设置为获取字符串类型的输出。
检查状态
通过 result.returncode
可以检查命令的执行状态。如果返回值为 0,则表示成功;任何非零值则表示发生了错误。例如,尝试运行一个不存在的命令:
result = subprocess.run(['nonexistent_command'], capture_output=True, text=True)
if result.returncode != 0:
print("命令执行失败,错误信息:")
print(result.stderr)
异常处理
当需要严格检查命令执行的状态并处理错误时,我们可以使用 check=True
参数。此时,任何非零返回码都会引发 CalledProcessError
异常:
try:
result = subprocess.run(['ls', '-l'], check=True, capture_output=True, text=True)
print("命令输出:")
print(result.stdout)
except subprocess.CalledProcessError as e:
print("命令执行失败,错误代码:", e.returncode)
print("错误信息:", e.stderr)
小结
通过 subprocess.run()
,我们可以方便地在 Python 中执行外部命令,并有效地处理返回状态和结果。掌握这一方法,可以使我们在开发脚本、自动化任务及与其他系统交互时更加高效和灵活。同时,注意合理处理异常和状态码,有助于提升程序的健壮性。