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