深入理解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开发时候的一些优化小妙招,用好这些优化小妙招让我们开发的系统架构、系统代码、开发流程、测试流程、运维监控看起来就跟写诗一样优雅,让我们每个人手头负责的代码和工程都要很漂亮~~~ 这里的优化小妙招很多不是说直…...

Elasticsearch 度量(Metric)聚合详解及示例
Elasticsearch 提供了强大的聚合功能,允许用户对数据进行深入的统计分析。度量(Metric)聚合是其中一种,它用于对数值型数据进行计算,如求和、平均值、最大值、最小值等。本文将详细介绍 Elasticsearch 的度量聚合&…...

基于 jsp 的健身俱乐部会员系统设计与实现
点击下载源码 基于 jsp 的健身俱乐部会员系统设计与实现 摘 要 目前我国虽然己经开发出了应用计算机操作的健身俱乐部管理系统,但管理软件,管理方法和管理思想三者往往相脱节。造成我国健身俱乐部信息管理系统极端化的缺陷。在国外健身俱乐部已经有了一…...

苍穹外卖项目DAY01
苍穹外卖项目Day01 1、软件开发整体介绍 1.1、软件开发流程 1.2、角色分工 项目经理:对整个项目负责,任务分配、把控进度产品经理:进行需求调研,输出需求调研文档、产品原型等UI设计师:根据产品原型输出界面效果图架…...

SpringBoot(Ⅰ)——HelloWorld和基本打包部署+Pom依赖概述+@SpringBootApplication注解+自动装配原理+约定大于配置
前言 如果SSM学的比较好,那么SpringBoot说白了就两件事:约定大于配置和自动装配 SpringBoot不会提供任何的功能拓展,完全依赖我们手动添加 所以SpringBoot的本质是一个依赖脚手架,可以快速集成配置各种依赖 1.1 SpringBoot相关依赖 创建…...

[Unity]关闭URP的SRP,开启GPU Instancing。
1. 对应材质的gpu instancing勾选上。 2. 游戏初始化时动态关闭SRP,或者在Graphics里全局关闭。动态关闭的代码如下: GraphicsSettings.useScriptableRenderPipelineBatching false; 模型合批的一些规则: 1. 模型一致。 2. 材质一致。 …...

04创建型设计模式——建造者模式
一、建造者模式简介 建造者模式(Builder Pattern)又被称为生成器模式。它旨在构建一个复杂对象的各个部分,而不需要指定该对象的具体类。该模式特别适用于对象的构建过程复杂且需要多个步骤的情况。建造者模式是一种对象创建型模式之一&…...

前端开发中的代码规范
引言 在前端开发中,遵循良好的代码规范是非常重要的。这不仅能提高代码的可读性和可维护性,还能帮助团队成员更好地协作。本文将介绍一些前端开发中常用的代码规范,并探讨它们的重要性。 1. 代码规范的重要性 1.1 可读性 良好的代码规范可…...

WHAT - 远程控制机制
目录 1. 客户端-服务器架构2. 连接建立3. 数据传输4. 通信协议5. 安全性6. 远程控制软件示例7. 操作流程示例 远程控制别人的电脑涉及到技术和安全多个方面。其基本机制通常包括以下几个方面: 1. 客户端-服务器架构 远程控制软件通常采用客户端-服务器架构&#x…...

苹果手机录音功能在哪里?3招轻松打开手机录音
无论是记录重要的会议内容、捕捉生活中的美好瞬间,还是进行语言学习,苹果手机的录音功能都能提供极大的便利。那么,苹果手机录音功能在哪里呢?本文将为您揭示苹果手机录音功能的藏身之处,并通过3个简单步骤,…...

RCE之突破长度限制
我们在写webshell时通常会遇到过滤,但除了过滤之外还可能会有长度限制,这里就简单说一下关于RCE突破长度限制的技巧 突破16位 例如:PHP Eval函数参数限制在16个字符的情况下 ,如何拿到Webshell? <?php $param …...