Python:subprocess 库高级用法举例和应用详解

Python:subprocess库高级用法举例和应用详解

模块介绍

subprocess 库是 Python 的标准库之一,自 Python 3.0 版本引入,用于创建子进程来执行 Shell 命令或其它可执行程序。通过 subprocess 库,用户可以启动新的应用程序,并且可以与之进行复杂的输入输出通信。subprocess 库弥补了老旧模块如 os.systemos.spawn*os.popen* 等的不足,无论是功能性还是安全性都更为优秀。

应用场景

subprocess 库主要用于以下场景:

  1. 执行 Shell 命令并获取其输出结果。例如:自动化脚本中执行系统命令。
  2. 管理和控制子进程。例如:启动、暂停、终止子进程。
  3. 进程间通信。通过管道(pipes)实现子进程与父进程之间的数据交换。

这些应用使得 subprocess 成为系统运维、自动化测试、数据处理等领域的必备工具。

安装说明

subprocess 库是 Python 的内置标准库,默认包含在 Python 安装包中。无需额外安装,只需在代码中直接导入即可使用。

1
import subprocess

用法举例

下面通过三个详细举例展示如何在实际场景中使用 subprocess 库。

例子 1: 执行 Shell 命令并获取输出

假设你需要在 Python 脚本中执行一个 Shell 命令并获取其输出结果。

1
2
3
4
5
6
7
8
9
10
import subprocess

# 定义Shell命令
command = "ls -l"

# 执行命令并捕获输出,返回结果为CompletedProcess对象
result = subprocess.run(command, shell=True, capture_output=True, text=True)

# 打印命令输出结果
print(result.stdout) # 输出命令执行后的结果

例子 2: 管理和控制子进程

假设你正在编写一个脚本,需要启动一个子进程并进行一系列控制操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
import subprocess

# 启动一个子进程,运行一个长期执行的任务
process = subprocess.Popen(["ping", "-c", "5", "www.google.com"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

try:
# 等待子进程结束并获取其输出
stdout, stderr = process.communicate(timeout=10)
print(stdout.decode()) # 打印命令输出结果
except subprocess.TimeoutExpired:
process.kill() # 超时情况下终止子进程
stdout, stderr = process.communicate()
print("Process killed due to timeout.")

例子 3: 进程间通信

假设你需要让父进程和子进程之间进行数据交换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import subprocess

# 定义需要传给子进程的输入数据
input_data = "Hello from parent process!"

# 启动子进程
process = subprocess.Popen(
["python", "-c", "print(input())"],
stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True
)

# 向子进程发送数据,并获取子进程的输出
stdout, stderr = process.communicate(input=input_data)

# 打印子进程的输出结果
print(f"Child process output: {stdout.strip()}") # 输出:Child process output: Hello from parent process!

强烈建议大家关注我的博客「全糖冲击博客」!这里包含了所有 Python 标准库的使用教程,方便查询和学习。不仅有详细的代码示例,还提供了各个模块在实际项目中的应用场景分析。通过关注博客,您可以系统性地学习 Python 标准库的使用方法,掌握更高效的编程技巧,更有助于提升编程效率和代码质量。快来加入我们的学习社区,一起成长吧!

软件版本可能变动

如果本文档不再适用或有误,请留言或联系我进行更新。让我们一起营造良好的学习氛围。感谢您的支持! - Travis Tang