当前位置: 首页 > article >正文

python subproces模块

文章目录

  • subprocess 模块概述
  • 常用的封装函数
  • Popen 类与灵活控制
  • 高级用法:`Popen` 对象
  • 子进程的标准流控制
  • 基本用法:`subprocess.run()`
  • 处理超时和错误
  • 进程间通信:与子进程交互
  • 子进程和并发处理
  • 示例:批量执行命令并记录日志
  • 完整示例:多任务流水线
  • 总结


在 Python 中,subprocess 模块是用于执行外部命令和子进程管理的强大工具。它不仅能替代旧的 os.system()os.popen() 函数,而且提供了更灵活和强大的控制方式,适合处理输入输出、进程控制等需求。以下是对 subprocess 模块的详解,包括常用方法和丰富的示例。

subprocess 模块概述

在 Python 中运行外部命令时,实际上是创建了一个新进程。subprocess 模块封装了一系列函数来创建和管理子进程,同时提供了多种方式来处理标准输入输出流。它可以用来替代早期的 os.system()os.popen(),让进程间的文本通信和控制更加便捷。

常用的封装函数

  1. subprocess.call():用于执行命令并等待其完成。返回值为命令的退出码(类似于 Linux 中的 exit code)。
  2. subprocess.check_call():与 call 类似,但在子进程返回非零退出码时抛出 subprocess.CalledProcessError 异常。
  3. subprocess.check_output():用于获取子进程的标准输出,返回输出内容。若进程退出码非零,则同样抛出 CalledProcessError 异常。

例如,使用 subprocess.call() 执行 ls -l 命令:

import subprocess

return_code = subprocess.call(["ls", "-l"])
print("Exit Code:", return_code)

Popen 类与灵活控制

subprocess 模块的核心是 Popen 类,通过它可以对子进程进行更细粒度的管理,比如非阻塞运行、管道传输等。Popen 是所有高级函数的底层实现,当我们需要自定义行为时,可以直接使用它。

  • Popen 对象创建后不会自动等待子进程完成。调用 Popen.wait() 可使主进程阻塞,直到子进程结束。
  • 多种方法poll() 检查进程状态,kill()terminate() 可终止进程,communicate() 则用于进程间输入输出的交互。

示例:

import subprocess

# 运行 ping 命令并等待完成
child = subprocess.Popen(['ping', '-c', '4', 'google.com'])
print("Parent process running...")
child.wait()
print("Ping completed.")

高级用法:Popen 对象

Popen 提供了更细粒度的控制,允许在不阻塞程序的情况下异步执行命令,还支持通过管道传递数据。以下示例展示了通过管道连接 grepsort 命令:

p1 = subprocess.Popen(['grep', 'pattern', 'file.txt'], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['sort'], stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close()  # 允许 p1 退出
output, _ = p2.communicate()  # 捕获结果
print(output.decode())

子进程的标准流控制

使用 Popen 时,子进程的 stdinstdoutstderr 可以被重定向或连接成管道。subprocess.PIPE 用于将一个进程的输出作为另一个进程的输入,通过 communicate() 方法与子进程进行交互。

示例:将 ls 的输出传递给 grep 命令进行筛选:

import subprocess

# 通过管道传递输出
p1 = subprocess.Popen(["ls", "-l"], stdout=subprocess.PIPE)
p2 = subprocess.Popen(["grep", "pattern"], stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close()
output = p2.communicate()[0]
print("Filtered output:\n", output.decode())

基本用法:subprocess.run()

subprocess.run() 是 Python 3.5 引入的更简洁的接口,用于运行命令并等待完成。可以通过 check 参数指定是否在命令失败时报错,通过 capture_output 参数捕获命令的输出。

import subprocess

# 执行简单的命令并返回结果
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print("Standard Output:", result.stdout)
print("Standard Error:", result.stderr)
print("Return Code:", result.returncode)

处理超时和错误

subprocess.run() 可以设置超时时间并处理异常。例如:

try:
    result = subprocess.run(['sleep', '10'], timeout=5)
except subprocess.TimeoutExpired:
    print("Command timed out!")

进程间通信:与子进程交互

可以通过 stdin.write()stdout.read() 与子进程交互。例如,以下代码向 Python 子进程输入数据并读取输出:

process = subprocess.Popen(['python3'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True)
output, _ = process.communicate("print('Hello from subprocess')\n")
print("Output from subprocess:", output)

子进程和并发处理

使用多个 Popen 实例可以实现并发处理。例如并发执行两个命令:

p1 = subprocess.Popen(['ping', '-c', '4', 'google.com'])
p2 = subprocess.Popen(['ping', '-c', '4', 'bing.com'])
p1.wait()
p2.wait()

示例:批量执行命令并记录日志

可以使用 subprocess 将输出重定向到日志文件,适合批量处理任务:

with open("output.log", "w") as log_file:
    subprocess.run(['ls', '-l'], stdout=log_file, stderr=subprocess.STDOUT)

完整示例:多任务流水线

以下示例展示如何使用 subprocess 实现复杂的命令流水线,通过 grepcutsort 来处理数据:

p1 = subprocess.Popen("ps aux | grep python", shell=True, stdout=subprocess.PIPE)
p2 = subprocess.Popen(['cut', '-c', '1-100'], stdin=p1.stdout, stdout=subprocess.PIPE)
p3 = subprocess.Popen(['sort'], stdin=p2.stdout, stdout=subprocess.PIPE)
output, _ = p3.communicate()
print(output.decode())

总结

subprocess 是 Python 中非常灵活的外部命令调用模块,可以满足多种复杂的需求。希望上述内容和示例能帮助理解和掌握 subprocess 的各种用法。


http://www.kler.cn/news/366763.html

相关文章:

  • springboot配置文件占位符${},赋值方式
  • 纯血鸿蒙的最难时刻才开始
  • linux网络编程5——Posix API和网络协议栈,使用TCP实现P2P通信
  • Claude Financial Data Analyst:基于Claude的金融数据分析工具!免费开源!
  • 【DSP】TI 微控制器和处理器的IDE安装CCSTUDIO
  • VS code部署Vue项目Demo
  • 安装Maven配置以及构建Maven项目(2023idea)
  • 智慧铜矿厂综合管控平台 | 图扑软件
  • 计算机网络的主要知识点小结
  • 反向代理服务器---NGINX
  • 【PHP】在ThinkPHP6中Swoole与FPM的简单性能测试对比
  • FullRankMatrix
  • 【Vulnhub靶场】DC-4
  • SQL注入之sqlilabs靶场21-30题
  • 宠物用品交易网站:SpringBoot技术实现策略
  • PHP 8.1.0-dev后门远程命令执行漏洞
  • 基于Python大数据的王者荣耀战队数据分析及可视化系统
  • 十、SQL 高级技法全解析
  • 【每日一题】LeetCode - 整数转罗马数字
  • 基于SSM美容院管理系统的设计
  • 读取视频指定帧的方式
  • Qt中使用线程之moveToThread
  • Maven 不同环境灵活构建
  • spring-boot-starter-data-redis
  • electron 打包
  • webGL是前端开发的天花板,3D可视化大屏还在天花板以上。