在 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 应用中。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部