掌握 Python 外部命令执行:轻松实现系统级交互

在 Python 编程中,除了使用 Python 内置的功能和库外,有时还需要与操作系统进行交互,执行外部命令。这种能力在自动化脚本、系统管理、数据处理等方面非常有用。本文将详细介绍如何在 Python 中执行外部命令,以及一些相关的高级用法和最佳实践。

1. 使用 os.system()

Python 的 os 模块提供了一个非常简单的函数 system() 来执行外部命令。这个函数会阻塞 Python 脚本的执行,直到外部命令执行完成。

1
2
3
import os

os.system('ls -l')

在上面的例子中,我们执行了 Linux 系统的 ls -l 命令,列出当前目录下的所有文件和文件夹。

2. 使用 subprocess 模块

subprocess 模块是 Python 中执行外部命令的更强大和灵活的方式。它允许你启动一个新的进程,连接到它的输入/输出/错误管道,并获取它的返回码。

2.1 subprocess.run()

Python 3.5 引入了 subprocess.run() 函数,这是执行外部命令的最简单方法。

1
2
3
import subprocess

result = subprocess.run(\['ls', '-l'\], stdout=subprocess.PIPE, text=True)print(result.stdout)

这个例子中,我们执行了相同的 ls -l 命令,并通过 stdout=subprocess.PIPE 将输出捕获到 result.stdout 中。

2.2 subprocess.Popen()

对于更复杂的场景,可以使用 subprocess.Popen()。它允许你更多地控制新进程的创建和运行。

1
2
3
4
5
import subprocess

process = subprocess.Popen(\['ls', '-l'\], stdout=subprocess.PIPE, text=True)stdout, stderr = process.communicate()

print(stdout)

3. 处理输出和错误

在执行外部命令时,通常需要处理命令的输出和错误。使用 subprocess 模块可以很容易地做到这一点。

3.1 捕获输出

如前所述,可以通过设置 stdout=subprocess.PIPE 来捕获命令的输出。

3.2 捕获错误

类似地,可以通过设置 stderr=subprocess.PIPE 来捕获命令的错误输出。

pythonresult = subprocess.run(['ls', 'nonexistent_file'], stderr=subprocess.PIPE, text=True)print(result.stderr)

4. 高级用法

4.1 执行 Shell 命令

有时你可能需要执行更复杂的 Shell 命令。这可以通过将命令作为字符串传递给 subprocess.run()subprocess.Popen() 来实现。

pythonresult = subprocess.run('ls -l | grep "file.txt"', shell=True, stdout=subprocess.PIPE, text=True)print(result.stdout)

4.2 传递环境变量

在执行外部命令时,可能需要传递环境变量。这可以通过 env 参数实现。

pythonenv = os.environ.copy()env['MY_VAR'] = 'my_value'result = subprocess.run(['printenv'], env=env, stdout=subprocess.PIPE, text=True)print(result.stdout)

5. 最佳实践

  • 总是尽可能使用 subprocess.run(),因为它更简单、更安全。
  • 当需要更高级的功能时,使用 subprocess.Popen()
  • 避免使用 os.system(),因为它不如 subprocess 模块灵活和安全。
  • 当执行来自用户输入或不可信来源的命令时,要非常小心,以避免安全风险。

通过掌握 Python 中的外部命令执行,你可以更轻松地与操作系统交互,实现更强大的脚本和应用程序。