Python如何使用subprocess模块来执行Linux命令

简介

在Python中,可以使用subprocess模块执行外部命令,包括在Linux系统中运行的命令。使用subprocess模块可以方便地调用命令行工具,获取命令的输出结果以及处理命令的输入和错误信息。

使用subprocess执行简单命令

subprocess模块提供了多个函数来执行外部命令,其中最常用的是subprocess.run()函数。下面是一个简单的示例,展示如何使用subprocess执行一个Linux命令:

import subprocess

# 执行ls命令
result = subprocess.run(['ls'], capture_output=True, text=True)

# 输出命令的输出结果
print(result.stdout)

在上面的例子中,我们使用subprocess.run()函数执行了ls命令,并将其输出结果保存在result变量中。然后,我们使用print()函数打印出了命令的输出结果。

subprocess.run()函数接受一个列表作为参数,列表中的每个元素代表一个命令及其参数。在上面的例子中,我们将ls命令作为参数传递给subprocess.run()函数。

capture_output=True参数用于捕获命令的输出结果。text=True参数用于将命令的输出结果以文本形式返回。

处理命令的输入和错误信息

除了获取命令的输出结果,subprocess模块还可以处理命令的输入和错误信息。

import subprocess

# 执行cat命令,从标准输入读取数据
input_data = 'Hello, World!'
result = subprocess.run(['cat'], input=input_data, capture_output=True, text=True)

# 输出命令的输出结果
print(result.stdout)

在上面的例子中,我们使用subprocess.run()函数执行了cat命令,并通过input参数将数据传递给命令的标准输入。input_data变量存储了要传递给命令的数据。

capture_output=True参数用于捕获命令的输出结果。text=True参数用于将命令的输出结果以文本形式返回。

除了处理命令的输入,subprocess模块还可以处理命令的错误信息。使用subprocess.run()函数的stderr属性可以获取命令的错误信息。下面是一个示例:

import subprocess

# 执行一个不存在的命令
result = subprocess.run(['command_not_exist'], capture_output=True, text=True)

# 输出命令的错误信息
print(result.stderr)

在上面的例子中,我们执行了一个不存在的命令,然后使用result.stderr获取命令的错误信息。

运行带有管道的命令

subprocess模块还可以执行带有管道的命令,即将一个命令的输出作为另一个命令的输入。下面是一个示例:

import subprocess

# 执行带有管道的命令
result = subprocess.run(['ls', '|', 'grep', 'txt'], capture_output=True, text=True, shell=True)

# 输出命令的输出结果
print(result.stdout)

在上面的例子中,我们执行了一个带有管道的命令,即先执行ls命令获取当前目录下的文件列表,然后将结果传递给grep命令,只保留包含txt的文件。

shell=True参数用于启用shell解析命令,这样就可以使用管道符号|

序列图

下面是一个使用subprocess模块执行Linux命令的序列图,用mermaid语法表示:

sequenceDiagram
    participant Python
    participant subprocess
    participant Linux

    Python -> subprocess: run(['ls'], capture_output=True, text=True)
    subprocess -> Linux: 执行ls命令
    Linux --> subprocess: 返回命令的输出结果
    subprocess --> Python: 返回结果给Python

    Python -> subprocess: run(['cat'], input=input_data, capture_output=True, text=True)
    subprocess -> Linux: 执行cat命令,从标准输入读取数据
    Linux --> subprocess: 返回命令的输出结果
    subprocess --> Python: 返回结果给Python

    Python -> subprocess: run(['command_not_exist'], capture_output