在 Python 中,subprocess
模块是一个强大的工具,用于创建和管理子进程。它允许你在 Python 程序中启动新进程,连接到它们的输入、输出和错误管道,以消耗它们的返回值。通过 subprocess
,你可以方便地运行外部命令和程序,并处理它们的输入和输出。
subprocess
模块的基本用法
subprocess
模块提供了几个函数来创建和管理子进程,其中最常用的是 subprocess.run()
、subprocess.Popen()
和 subprocess.call()
。
1. subprocess.run()
subprocess.run()
是在 Python 3.5 中引入的,它是执行一个外部命令并等待其完成的最简单方式。此函数返回一个 CompletedProcess
实例,包含命令的返回码,以及标准输出和标准错误输出。
import subprocess
# 执行 ls 命令并获取输出
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
# 打印标准输出
print("标准输出:")
print(result.stdout)
# 打印返回码
print("返回码:", result.returncode)
在上述代码中,我们使用 ls -l
命令列出当前目录中的文件。capture_output=True
参数表示捕获标准输出和标准错误输出,text=True
则表示以字符串的形式返回输出,而不是字节字符串。
2. subprocess.Popen()
subprocess.Popen()
是一个更灵活的接口,可以让你实时地与子进程进行交互。它不会等待子进程完成,但你可以通过调用 communicate()
方法来等待其完成并获取输出。
import subprocess
# 启动一个子进程
process = subprocess.Popen(['ping', 'www.google.com'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
# 实时读取输出
while True:
output = process.stdout.readline()
if output == '' and process.poll() is not None:
break
if output:
print(output.strip())
# 获取返回码
return_code = process.poll()
print("返回码:", return_code)
在这个示例中,我们启动了一个 ping
命令的子进程,并通过 stdout
管道实时读取输出。可以通过 process.poll()
获取子进程的返回码。
3. subprocess.call()
subprocess.call()
函数用于运行命令,但它比 run()
更简单,因为它只返回命令的返回码,不会返回标准输出。
import subprocess
# 执行命令并获取返回码
return_code = subprocess.call(['echo', 'Hello, World!'])
print("返回码:", return_code)
在这个例子中,subprocess.call()
执行了 echo
命令,它会直接在控制台输出 "Hello, World!"。
捕获标准错误
在处理外部命令时,有时会遇到错误输出。subprocess
允许你捕获标准错误输出:
import subprocess
# 执行一个可能失败的命令
result = subprocess.run(['ls', 'non_existent_file'], capture_output=True, text=True)
# 检查返回码
if result.returncode != 0:
print("错误输出:")
print(result.stderr)
在此示例中,我们试图列出一个不存在的文件。通过 result.stderr
我们可以获取到错误信息。
总结
subprocess
模块是 Python 中与操作系统交互的强大工具。它提供了多种方式来执行外部命令和进程,并处理其输入和输出。在实际开发中,通过理解和使用 subprocess
,你可以轻松地将外部程序的功能集成到 Python 应用中。