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

Python subprocess 模块详解

Python subprocess 模块详解

subprocess 模块是 Python 中用于创建和管理子进程的标准库,它允许你启动新的应用程序、连接到它们的输入/输出/错误管道,并获取它们的返回码。

基本用法

1. 运行简单命令

import subprocess# 运行命令并等待完成
result = subprocess.run(['ls', '-l'])
print(result)

2. 捕获输出

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

3. 检查返回码

result = subprocess.run(['ls', '/nonexistent'], capture_output=True, text=True)
if result.returncode != 0:print(f"命令失败,错误信息: {result.stderr}")

主要函数

subprocess.run()

最常用的函数,运行命令并等待完成:

subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None, check=False, capture_output=False,text=None, encoding=None, errors=None)

参数说明:

  • args: 命令列表或字符串(当shell=True时)
  • capture_output: 捕获stdout和stderr
  • text: 以文本模式处理输入输出(Python 3.7+)
  • check: 如果为True,当返回码非零时抛出异常

其他常用函数

  • subprocess.call(): 运行命令并等待完成,返回返回码
  • subprocess.check_call(): 类似call(),但当返回码非零时抛出异常
  • subprocess.check_output(): 运行命令并返回输出
  • subprocess.Popen(): 更底层的控制,用于复杂场景

高级用法

1. 管道通信

p1 = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['grep', '.py'], stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close()  # 允许p1接收SIGPIPE信号
output = p2.communicate()[0]
print(output.decode('utf-8'))

2. 交互式进程

process = subprocess.Popen(['python3'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE,text=True)process.stdin.write("print('Hello from subprocess!')\n")
process.stdin.write("exit()\n")
output = process.communicate()[0]
print(output)

3. 处理超时

try:result = subprocess.run(['sleep', '10'], timeout=5)
except subprocess.TimeoutExpired:print("命令超时")

安全注意事项

  1. 避免使用shell=True:当使用shell=True时,命令会通过shell执行,可能带来shell注入风险

    # 不安全
    subprocess.run(f'echo {user_input}', shell=True)# 更安全的方式
    subprocess.run(['echo', user_input])
    
  2. 如果必须使用shell特性,考虑使用shlex.quote()对参数进行转义

实际示例

检查网络连接

import subprocess
import shlexdef check_ping(host):command = f"ping -c 1 {host}"try:subprocess.run(command, shell=True, check=True, timeout=5)print(f"{host} 可达")except (subprocess.CalledProcessError, subprocess.TimeoutExpired):print(f"{host} 不可达或超时")

下载文件

import subprocessdef download_file(url, output_path):try:subprocess.run(['curl', '-o', output_path, url], check=True)print("下载成功")except subprocess.CalledProcessError as e:print(f"下载失败: {e}")

subprocess 模块功能强大,可以替代 os.system()os.popen() 等旧方法,是 Python 中处理子进程的推荐方式。

http://www.lryc.cn/news/573229.html

相关文章:

  • 60-Oracle 10046事件-实操
  • Java面试复习指南:JVM原理、并发编程与Spring框架
  • 微服务架构的适用
  • Zephyr 电源管理机制深度解析:从 Tickless Idle 到平台 Suspend 实践
  • 【设计模式】6.原型模式
  • 道德的阶梯:大语言模型在复杂道德困境中的价值权衡
  • 经典控制理论:线性化笔记
  • 开源无广告GIF 制作软件三模录制,教程 / 游戏 GIF 一键生成支持鼠标轨迹显示
  • Linux运维新人自用笔记(Ubuntu磁盘命名规则、新磁盘分区、主流文件系统类型、mkfs命令格式化文件系统、临时和永久挂载、挂载报错、dd指令)
  • [muduo] TcpConnection | 回调交互
  • Go语言网络编程:使用 net/http 构建 RESTful API
  • React JSX语法
  • 分布式锁的四种实现方式:从原理到实践
  • 【Linux仓库】进程概念与基本操作【进程·贰】
  • 使用 Telegraf 向 TDengine 写入数据
  • HarmonyOS 5的分布式通信矩阵是如何工作的?
  • Flink流水线+Gravitino+Paimon集成
  • 5.2 Qt Creator 使用FFmpeg库
  • ffmpeg(六):图片与视频互转命令
  • 项目练习:Jaspersoft Studio制作PDF报表时,detail和column footer之间存在很大的空白区
  • VR油库虚拟仿真系统:开启智慧油库新时代
  • 广州华锐互动:以技术创新引领虚拟现实体验新高度
  • 蚂蚁百宝箱快速创建智能体AI小程序
  • 【Node】最佳Node.js后端开发模板推荐
  • win环境使用openssl创建p12证书
  • 18年磨一剑!开利科技启动数字化增量投资新时代
  • 软件工程概述:核心概念、模型与方法全解析
  • (详细介绍)线性代数中的零空间(Null Space)
  • Java、PHP、C++ 三种语言实现爬虫的核心技术对比与示例
  • Mac电脑-触摸板增强工具-BetterTouchTool