深入理解Python中的subprocess模块
目录
- subprocess模块简介
- 常用函数
- 执行外部命令
- 管道通信
- 子进程管理
- 错误处理
- 实际应用示例
- 最佳实践
subprocess模块简介
subprocess
模块是Python标准库的一部分,提供了一个跨平台的方法来生成新进程、连接其输入/输出/错误管道,并获取其返回码。该模块旨在替代旧的os.system
、os.spawn*
、os.popen*
和commands
模块,提供一个更强大和灵活的接口。
常用函数
subprocess
模块中有几个常用的函数和类,它们是进行进程管理和管道通信的核心:
subprocess.run()
subprocess.Popen()
subprocess.call()
subprocess.check_call()
subprocess.check_output()
subprocess.DEVNULL
subprocess.PIPE
subprocess.STDOUT
示例代码
import subprocess# 运行一个命令并等待其完成
subprocess.run(["ls", "-l"])# 使用Popen对象启动和管理进程
process = subprocess.Popen(["ls", "-l"], stdout=subprocess.PIPE)
output, error = process.communicate()
print(output.decode())
执行外部命令
使用subprocess.run()
subprocess.run()
是执行外部命令的推荐方式。它接受一个命令序列或字符串,返回一个CompletedProcess
实例,包含了命令的执行结果。
示例代码
import subprocess# 执行命令并等待完成
result = subprocess.run(["echo", "Hello, World!"], capture_output=True, text=True)
print(result.stdout)
使用subprocess.call()
subprocess.call()
用于执行命令并返回其退出状态。它类似于subprocess.run()
,但不会返回CompletedProcess
实例。
示例代码
import subprocess# 执行命令并返回退出状态
return_code = subprocess.call(["ls", "-l"])
print(f"Return code: {return_code}")
使用subprocess.check_call()
subprocess.check_call()
类似于subprocess.call()
,但如果命令返回非零退出状态,它会引发CalledProcessError
异常。
示例代码
import subprocesstry:subprocess.check_call(["ls", "-l"])
except subprocess.CalledProcessError as e:print(f"Command failed with return code {e.returncode}")
使用subprocess.check_output()
subprocess.check_output()
执行命令并返回其输出。如果命令返回非零退出状态,它会引发CalledProcessError
异常。
示例代码
import subprocesstry:output = subprocess.check_output(["echo", "Hello, World!"], text=True)print(output)
except subprocess.CalledProcessError as e:print(f"Command failed with return code {e.returncode}")
管道通信
subprocess
模块允许开发者通过管道连接多个进程,实现进程间通信。使用subprocess.PIPE
可以将子进程的输入/输出/错误重定向到父进程。
示例代码
import subprocess# 将子进程的输出重定向到父进程
process = subprocess.Popen(["echo", "Hello, World!"], stdout=subprocess.PIPE)
output, error = process.communicate()
print(output.decode())
管道连接示例
import subprocess# 使用管道连接两个命令
p1 = subprocess.Popen(["echo", "Hello, World!"], stdout=subprocess.PIPE)
p2 = subprocess.Popen(["grep", "Hello"], stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close() # 允许p1关闭它的输出管道
output, error = p2.communicate()
print(output.decode())
子进程管理
终止子进程
可以使用Popen
对象的terminate()
和kill()
方法终止子进程。
示例代码
import subprocess
import time# 启动一个长时间运行的进程
process = subprocess.Popen(["sleep", "10"])# 等待2秒后终止进程
time.sleep(2)
process.terminate()
process.wait()
print("Process terminated")
获取子进程的返回码
可以使用Popen
对象的returncode
属性获取子进程的返回码。
示例代码
import subprocessprocess = subprocess.Popen(["ls", "-l"], stdout=subprocess.PIPE)
process.wait()
print(f"Return code: {process.returncode}")
错误处理
捕获异常
在执行外部命令时,可能会遇到各种异常情况。subprocess
模块提供了CalledProcessError
和TimeoutExpired
异常,便于开发者处理错误。
示例代码
import subprocesstry:subprocess.check_call(["false"])
except subprocess.CalledProcessError as e:print(f"Command failed with return code {e.returncode}")
超时处理
可以使用timeout
参数设置命令的超时时间,如果命令在指定时间内没有完成,将引发TimeoutExpired
异常。
示例代码
import subprocesstry:subprocess.run(["sleep", "10"], timeout=5)
except subprocess.TimeoutExpired:print("Command timed out")
实际应用示例
运行shell命令
在实际应用中,subprocess
模块常用于运行shell命令。使用shell=True
参数可以在shell中执行命令。
示例代码
import subprocessresult = subprocess.run("ls -l | grep .py", shell=True, capture_output=True, text=True)
print(result.stdout)
备份数据库
可以使用subprocess
模块执行数据库备份命令,将备份文件保存到指定路径。
示例代码
import subprocesscommand = ["mysqldump", "-u", "root", "-p", "database_name"]
with open("backup.sql", "w") as f:result = subprocess.run(command, stdout=f)if result.returncode == 0:print("Backup successful")else:print("Backup failed")
自动化脚本
subprocess
模块可以用于编写自动化脚本,执行一系列的命令完成特定任务。
示例代码
import subprocessdef run_commands(commands):for command in commands:result = subprocess.run(command, shell=True, capture_output=True, text=True)if result.returncode != 0:print(f"Command failed: {command}")print(result.stderr)breakelse:print(result.stdout)commands = ["echo 'Starting automation script'","mkdir -p /tmp/test_directory","touch /tmp/test_directory/test_file","echo 'Automation script completed'"
]run_commands(commands)
最佳实践
- 避免使用
shell=True
: 除非必要,否则尽量避免使用shell=True
,以减少安全风险。 - 使用完整路径: 在命令中使用完整路径,以确保命令能够正确执行。
- 处理异常: 始终捕获并处理可能出现的异常,确保程序的健壮性。
- 设置超时: 对长时间运行的命令设置超时,以避免程序挂起。
- 使用上下文管理器: 使用上下文管理器管理文件对象,确保资源正确释放。
示例代码
import subprocessdef safe_run_command(command, timeout=10):try:result = subprocess.run(command, capture_output=True, text=True, timeout=timeout)result.check_returncode()return result.stdoutexcept subprocess.CalledProcessError as e:print(f"Command '{e.cmd}' failed with return code {e.returncode}")except subprocess.TimeoutExpired as e:print(f"Command '{e.cmd}' timed out after {e.timeout} seconds")output = safe_run_command(["ls", "-l"])
print(output)
结论
subprocess
模块是Python中执行外部命令和管理子进程的强大工具。通过学习并掌握subprocess
模块的使用,可以编写出高效、可靠的自动化脚本和系统
管理工具。本文详细介绍了subprocess
模块的基本概念、常用函数、管道通信、子进程管理、错误处理及实际应用示例,希望对读者有所帮助。通过不断实践和应用这些知识,开发者能够提高代码质量,减少错误,提升开发效率。
相关文章:
深入理解Python中的subprocess模块
目录 subprocess模块简介常用函数执行外部命令管道通信子进程管理错误处理实际应用示例最佳实践 subprocess模块简介 subprocess模块是Python标准库的一部分,提供了一个跨平台的方法来生成新进程、连接其输入/输出/错误管道,并获取其返回码。该模块旨…...

从零开始搭建 EMQX 集群压测框架
从零开始搭建 EMQX 集群压测框架 架构 在设计以EMQX为中心的MQTT消息队列集群压力测试框架时,我们采用微服务架构模式。EMQX作为消息队列的核心,负责处理MQTT协议的消息发布和订阅。Nginx作为EMQX的反向代理,负责负载均衡和SSL/TLS终端。MQT…...

ArkUI基本介绍
ArkUI:提供HarmonyOS应用UI开发框架,几件开发、精致体验、跨设备/跨平台。 ArkUI(方舟UI框架)为应用的UI开发提供了完整的基础设施,包括简洁的UI语法、丰富的UI功能(组件、布局、动画以及交互事件ÿ…...

vue2+OpenLayers 天地图上打点并且显示相关的信息(2)
上次是在地图上打点 这次鼠标移动在图标上面显示相关的信息 首先有两个事件 鼠标移入 和 鼠标移出事件 pointermove pointerout 鼠标放上去之前 放上去后 代码如下 <template><div class"container"><div id"vue-openlayers" class&quo…...

c++继承(二)
一、友元函数的继承 友元函数不能被继承,就像爸爸的朋友不是你的朋友,如果要有友元函数,在子类重新定义一个。 二、静态成员的继承 静态成员的继承仍然是那个成员,普通成员的继承是不同的。 父类的静态成员属于当前类…...

低代码开发的崛起:机遇与挑战
近年来,“低代码”开发平台的迅速崛起,已经成为IT行业中不可忽视的趋势。这些平台承诺让非专业人士也能快速构建应用程序,通过减少代码编写的需求,大幅提高开发效率。对于许多企业而言,低代码开发工具成为了一个加速数…...
Json-JacksonUtils工具类
为了创建一个通用的 Jackson 工具类,我们可以定义一个名为 JacksonUtils 的工具类,该类将提 供多种方法来支持不同类型的 JSON 转换需求。下面是一个示例实现,包括基本的 JSON 到 Java 对象的转换、Java 对象到 JSON 的转换、以及更复杂的类型如 CommonResult 的转换。 C…...
svn客户端装完后没有svn.exe
如果SVN客户端(如TortoiseSVN)安装完成后,在预期的安装目录(通常是bin目录)中没有找到svn.exe文件,这通常是因为在安装过程中没有选择安装命令行客户端工具(Command Line Client Toolsÿ…...

TinyWebserver的复现与改进(4):主线程的具体实现
GitHub - yzfzzz/MyWebServer: Linux高并发服务器项目,参考了TinyWebServer,将在此基础上进行性能改进与功能增加。为方便读者学习,附带详细注释和博客! TinyWebserver的复现与改进(1):服务器环…...
DaemonSet 不能帮助我们做什么事情?
DaemonSet 不能帮助我们做什么事情? A. 保证集群内每一个(或者一些)节点都运行一组相同的Pod B. 跟踪集群节点状态,保证新加入的节点自动创建对应的Pod C. 跟踪集群节点状态,保证移除的节点删除对应的Pod D. 能够设置Pod重试次数,…...
开源模型应用落地-LangChain高阶-记忆组件-RedisChatMessageHistory正确使用(八)
一、前言 LangChain 的记忆组件发挥着至关重要的作用,其旨在协助大语言模型(LLM)有效地留存历史对话信息。通过这一功能,使得大语言模型在对话过程中能够更出色地维持上下文的连贯性和一致性,进而能够像人类的记忆运作方式那样,进行更为自然、流畅且智能化的交互。 它仿佛…...

解决Openwrt 串口默认是没有密码的方法
将串口登录加入密码方法如下: 步骤一:配置busybox的登录,可以在.config文件中添加如下 CONFIG_BUSYBOX_CONFIG_LOGINy 添加后,需要重新编译busybox。 步骤二:修改target/linux/ramips/base-files/etc/inittab文件 将…...
【vue讲解:v-model 之 lazy、number、trim、与后端交互、小电影案例】
2 v-model 之 lazy、number、trim lazy:等待input框的数据绑定时区焦点之后再变化 number:数字开头,只保留数字,后面的字母不保留;字母开头,都保留 trim:去除首位的空格<!DOCTYPE html> …...

ECCV 2024 | 南洋理工三维数字人生成新范式:结构扩散模型
该论文作者均来自于新加坡南洋理工大学 S-Lab 团队,包括博士后胡涛,博士生洪方舟,以及计算与数据学院刘子纬教授(《麻省理工科技评论》亚太地区 35 岁以下创新者)。S-Lab 近年来在顶级会议如 CVPR, ICCV, ECCV, NeurIP…...

2024.8.13-算法学习(原创+转载)
一、什么是张量并行(Tensor Parallelism) ? 张量并行(Tensor Parallelism) 是一种分布式矩阵算法。 随着模型越来越大,模型内的矩阵也越来越大。一个大矩阵的乘法可以拆分成多个小矩阵的运算,…...

beautifulsoup的简单使用
文章目录 beautifulsoup一. beautifulsoup的简单使用1、安装2、如何使用3、对象的种类 二、beautifulsoup的遍历文档树2.1 子节点.contents 和 .children descendants2.2 节点内容.string.text 2.3 多个内容.strings**.stripped_strings** 2.4 父节点.parent.parents 三、beaut…...
【Python】Jupyter Notebook的安装及简单使用
Jupyter Notebook的安装及简单使用1、安装2、language设置为中文3、Jupyter Notebook启动4、Jupyter Notebook的常用快捷方式5、将Notebook笔记转为其他文件格式保存 Jupyter Notebook的安装及简单使用 不安装AnaCoda,但需要使用Jupyter Notebook 1、安装 pip inst…...

中国自动驾驶出租车冲击网约车市场
近年来,中国的自动驾驶技术迅速发展,对传统网约车市场构成了越来越大的冲击。随着科技巨头百度旗下的萝卜快跑等公司加速推广无人驾驶出租车,这一趋势引发了广泛的讨论和担忧。 自动驾驶技术的迅猛发展 中国自动驾驶行业正处于快速发展阶段&…...

解决浏览器书签同步问题,极空间部署开源免费的跨平台书签同步工具『xBrowserSync』
解决浏览器书签同步问题,极空间部署开源免费的跨平台书签同步工具『xBrowserSync』 哈喽小伙伴们好,我是Stark-C~ 作为一个喜欢折腾的数码党,我平时上网冲浪使用的浏览器绝不会只限于一种,就比如说我在上班的地方只会用到Edge浏…...
14个SpringBoot优化小妙招
今天我们来分享一下平时用SpringBoot开发时候的一些优化小妙招,用好这些优化小妙招让我们开发的系统架构、系统代码、开发流程、测试流程、运维监控看起来就跟写诗一样优雅,让我们每个人手头负责的代码和工程都要很漂亮~~~ 这里的优化小妙招很多不是说直…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...