在Python中执行Linux系统命令的三种常用方式是使用标准库中的 os.system
, subprocess.run
以及 subprocess.Popen
。以下是每种方法的详细解释、代码示例和注释:
os.system
这是执行系统命令的最简单方式之一。此方法会阻塞直到命令执行完成。返回值是命令的退出状态(通常,0 表示成功)。
import os
# 使用 os.system 执行命令
exit_status = os.system('ls -l')
print(f"Command exited with status: {exit_status}")
subprocess.run
subprocess.run
是 subprocess
模块中用于执行命令并获取其输出的推荐方法。它在 Python 3.5+ 中引入,是执行系统命令的现代方式。它比 os.system
提供了更多的灵活性,如输入、输出重定向,以及异常管理等。
import subprocess
# 使用 subprocess.run 执行命令
result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
# 输出结果,stdout 属性包含命令的输出
print("STDOUT:", result.stdout)
# 输出错误,stderr属性包含命令的错误输出,如果有的话
print("STDERR:", result.stderr)
此例中的 stdout=subprocess.PIPE
和 stderr=subprocess.PIPE
指示 subprocess.run
捕获命令的标准输出和标准错误输出。text=True
参数确保输出以文本形式而非字节形式返回。
subprocess.Popen
subprocess.Popen
提供了更底层和复杂的在 Python 脚本中启动子进程的方法。它非常灵活,可以处理复杂的用例,如提供输入、获取输出、管道命令以及非阻塞执行。
import subprocess
# 使用 subprocess.Popen 执行命令
with subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) as proc:
# 获取命令的输出和错误
stdout, stderr = proc.communicate()
# 输出结果
print("STDOUT:", stdout)
if stderr: # 如果有错误输出,打印出来
print("STDERR:", stderr)
使用 Popen.communicate()
方法是一种阻塞方式,它会等待命令完成,并读取输出。通过这种方式,我们能够读取和处理标准输出和标准错误。
每种方式都有其应用场景:
os.system
适合于简单的命令执行,不需要命令输出,适合快速脚本或者不关心返回内容的场景。subprocess.run
是一个更现代的方法,提供了更好的控制执行环境,输出捕获和错误处理。适合于需要处理命令输出,更复杂命令执行的情况。subprocess.Popen
提供了最大的灵活性,对于需要并行运行、管道连接、或者需要与子进程交互的复复杂任务,Popen
是最合适的选择。
在脚本中选择正确的方法将取决于个别的使用场景和所需的灵活性。通常,推荐先从 subprocess.run
开始,因为它既方便又足够强大,适用于大多数情况。如果有特殊需求或run
方法不足以处理的情况,再尝试使用Popen
。