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

Python调用外部程序实战:从os.system到subprocess的进阶指南

1. Python调用外部程序的基础方法在Python中调用外部程序是自动化任务中非常常见的需求。比如你可能需要在自己的Python脚本中集成一个已有的Windows工具或者批量处理某些文件。最基础的方法就是使用Python内置的os模块。我第一次接触这个功能是在做一个自动化测试工具时。当时需要调用一个第三方的测试程序用os.system()是最快实现的方式import os os.system(notepad.exe)这个方法简单直接就像在命令行里输入命令一样。但很快我就发现了它的局限性 - 你只能知道程序是否执行成功返回0表示成功却无法获取程序的输出结果。而且如果程序运行时间较长你的Python脚本会一直卡在那里等待。后来我发现os模块还有个popen()方法可以获取命令的输出import os output os.popen(dir).read() print(output)这个方法比system()进步了一些但仍然不够灵活。比如你无法同时获取标准输出和错误输出也无法实时获取程序的输出内容。这些限制让我开始寻找更好的解决方案。2. subprocess模块的进阶用法subprocess模块是Python专门为调用外部程序设计的模块它提供了更强大、更灵活的功能。我第一次使用subprocess.run()时感觉就像发现了新大陆import subprocess result subprocess.run([ping, www.baidu.com], capture_outputTrue, textTrue) print(result.stdout)这里有几个关键点需要注意命令参数要放在列表中这样能避免shell注入的安全风险capture_outputTrue可以捕获程序的输出textTrue让输出以字符串形式返回而不是字节在实际项目中我经常需要处理程序的错误输出。subprocess可以很方便地区分标准输出和错误输出try: result subprocess.run([some_program.exe], checkTrue, stdoutsubprocess.PIPE, stderrsubprocess.PIPE, textTrue) except subprocess.CalledProcessError as e: print(f程序出错{e.stderr}) else: print(f执行成功{result.stdout})3. 高级控制Popen类的使用当需要更精细地控制外部程序时subprocess.Popen类是最佳选择。我曾经开发过一个需要与外部程序交互的工具Popen帮了大忙import subprocess # 启动程序并建立管道 process subprocess.Popen([python, -i], stdinsubprocess.PIPE, stdoutsubprocess.PIPE, stderrsubprocess.PIPE, textTrue) # 向程序发送命令并获取输出 process.stdin.write(print(Hello, World!)\n) process.stdin.flush() output process.stdout.readline() print(output) # 关闭管道 process.stdin.close() process.terminate()Popen的强大之处在于可以实时与程序交互可以控制程序的输入输出流可以后台运行程序可以获取程序的返回码我在一个自动化测试框架中使用了Popen来并行运行多个测试用例效果非常好。4. 常见问题与解决方案在实际使用中我踩过不少坑这里分享几个常见问题的解决方法问题1程序路径包含空格# 错误写法 subprocess.run(C:\\Program Files\\App\\app.exe) # 正确写法 subprocess.run([C:\\Program Files\\App\\app.exe]) # 或者 subprocess.run(C:\\Program Files\\App\\app.exe, shellTrue)问题2设置工作目录subprocess.run([program.exe], cwdD:\\workdir)问题3超时控制try: subprocess.run([program.exe], timeout30) except subprocess.TimeoutExpired: print(程序运行超时)问题4环境变量设置import os new_env os.environ.copy() new_env[PATH] D:\\bin; new_env[PATH] subprocess.run([program.exe], envnew_env)5. 性能优化与最佳实践经过多个项目的实践我总结出一些优化技巧避免频繁创建子进程如果需要多次调用同一个程序考虑让程序支持批量处理模式。合理使用shell参数# 简单命令可以不用shell subprocess.run([dir], shellTrue) # Windows subprocess.run([ls], shellTrue) # Linux # 复杂命令建议使用shell subprocess.run(dir | findstr .txt, shellTrue)输出处理技巧# 实时获取输出 process subprocess.Popen([program.exe], stdoutsubprocess.PIPE, textTrue) for line in process.stdout: print(line, end)跨平台兼容性import sys cmd [dir] if sys.platform win32 else [ls] subprocess.run(cmd)6. 与PyInstaller结合使用PyInstaller是Python打包工具我经常用它把Python脚本打包成exe。这里分享几个实用技巧打包时包含外部程序 在spec文件中添加added_files [(external_program.exe, .)] a Analysis(... datasadded_files, ...)运行时获取程序路径import sys import os if getattr(sys, frozen, False): # 打包后的路径 app_path os.path.dirname(sys.executable) else: # 开发时的路径 app_path os.path.dirname(os.path.abspath(__file__)) program_path os.path.join(app_path, external_program.exe)处理控制台窗口 如果不想显示控制台窗口打包时加上-w参数pyinstaller -w your_script.py在实际项目中我通常会把这些技巧结合起来使用。比如先检测运行环境然后设置正确的工作目录和路径最后调用外部程序并处理输出。这样的脚本既健壮又易于维护。

相关文章:

Python调用外部程序实战:从os.system到subprocess的进阶指南

1. Python调用外部程序的基础方法 在Python中调用外部程序是自动化任务中非常常见的需求。比如你可能需要在自己的Python脚本中集成一个已有的Windows工具,或者批量处理某些文件。最基础的方法就是使用Python内置的os模块。 我第一次接触这个功能是在做一个自动化测…...

程序员必看!网络安全薪资高达5万+,这份免费学习资源助你转行高薪领域,建议收藏!

《程序员必看!网络安全薪资高达5万,这份免费学习资源助你转行高薪领域,建议收藏!》 本文分析了程序员工资水平及影响因素,指出技术实力和软实力是薪资差异的关键。特别指出网络安全领域人才缺口高达95万,薪…...

数字时代的自我主宰:软件测试从业者的技术戒断指南

在算法编织的比特洪流中,软件测试工程师,这群数字世界的“质检员”与“守门人”,正首当其冲地承受着技术双刃剑的另一面。我们终日与代码、设备和屏幕为伍,敏锐地捕捉每一个潜在缺陷,却也可能在无形中,让自…...

AI殖民主义数据战争:软件测试从业者的挑战、角色与破局之路

在数字时代的宏大叙事中,“AI殖民主义”正从一个学术概念演变为一场席卷全球的静默战争。这场战争的核心战场并非物理疆域,而是数据、算法与认知主权。对于身处技术前线的软件测试从业者而言,这场战争并非遥不可及的宏观叙事,而是…...

PyTorch Dataset类详解:从基础实现到高级优化

1. PyTorch数据集类基础解析在深度学习项目中,数据处理环节往往占据了整个开发流程70%以上的时间。PyTorch作为当前最流行的深度学习框架之一,其torch.utils.data.Dataset类为数据加载提供了标准化的解决方案。这个抽象类就像是一个数据容器,…...

HTC老机型救砖刷机指南:从官解到S-OFF,手把手带你绕过版本限制

HTC经典机型深度救砖指南:解锁、降级与固件自由之路 手里那台老HTC突然黑屏卡logo?升级后卡成幻灯片?或是单纯怀念当年那个丝滑流畅的Sense UI?别急着让它退休。作为曾经的刷机王者,HTC设备有着极强的可玩性——只要掌…...

技术返祖:软件测试中的纸质备份策略与哲学思辨

在数字化浪潮席卷全球的今天,“返祖”一词似乎与技术进步背道而驰。然而,当我们深入软件测试这一追求极致稳定与可靠的领域,会发现一种引人深思的现象正在悄然回归——对纸质备份的重新审视与策略性应用。这并非简单的技术倒退,而…...

终极Windows激活指南:KMS_VL_ALL_AIO智能脚本完全解析

终极Windows激活指南:KMS_VL_ALL_AIO智能脚本完全解析 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows激活而烦恼吗?KMS_VL_ALL_AIO智能激活脚本提供了一套…...

python agen

Python 的 asend 是异步生成器协议里的一个底层方法,很多人刚接触时容易把它和普通的 send 搞混,或者觉得它没什么用。其实在异步编程里,asend 扮演着一个挺微妙的角色,尤其是在处理协程之间的双向通信时。 先说说这个东西到底是什…...

Python调用Halcon引擎避坑指南:从环境配置到DLL依赖一步到位

Python与Halcon深度整合实战:跨平台部署全流程解析 在工业视觉领域,Halcon作为老牌机器视觉库与Python生态的融合越来越紧密。但当开发者兴冲冲地完成算法开发后,往往会发现程序在其他机器上根本无法运行——缺失的DLL、神秘的License报错、版…...

3分钟搞定!Windows系统显示iPhone HEIC照片缩略图终极指南

3分钟搞定!Windows系统显示iPhone HEIC照片缩略图终极指南 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC/HEIF files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails 还在为iPh…...

D3KeyHelper技术深度解析:基于AutoHotkey的暗黑3按键自动化实现原理

D3KeyHelper技术深度解析:基于AutoHotkey的暗黑3按键自动化实现原理 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper D3KeyHelper是一款基…...

LSB隐写术实战避坑指南:用Python处理大图时如何优化性能与正确评估隐藏效果

LSB隐写术实战避坑指南:用Python处理大图时如何优化性能与正确评估隐藏效果 当你第一次尝试在1000x1000像素的高清图片中嵌入秘密信息时,是否遇到过这样的场景:点击运行按钮后,盯着屏幕发呆五分钟,循环进度条像蜗牛爬行…...

10分钟掌握暗黑2存档编辑器:新手完整使用教程

10分钟掌握暗黑2存档编辑器:新手完整使用教程 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 你是否厌倦了在暗黑破坏神2中反复刷装备的枯燥过程?是否想快速体验不同职业build的乐趣却苦于培养周期太长&a…...

AMD Ryzen 处理器功耗调校终极指南:RyzenAdj 完整教程

AMD Ryzen 处理器功耗调校终极指南:RyzenAdj 完整教程 【免费下载链接】RyzenAdj Adjust power management settings for Ryzen APUs 项目地址: https://gitcode.com/gh_mirrors/ry/RyzenAdj RyzenAdj 是一款功能强大的开源工具,专门为 AMD Ryzen…...

5分钟掌握FreeRouting:终极PCB自动布线工具完全指南

5分钟掌握FreeRouting:终极PCB自动布线工具完全指南 【免费下载链接】freerouting Advanced PCB auto-router 项目地址: https://gitcode.com/gh_mirrors/fr/freerouting FreeRouting是一款专业的开源PCB自动布线工具,能够与KiCad、Eagle等主流PC…...

疲劳驾驶司机异常驾驶行为检测及预警系统的全面解决方案

疲劳驾驶司机异常驾驶行为检测及预警系统 1.开放全部源代码,可自行进行修改 2.提供完整程序打包软件.exe,不用任何编译环境,直接点开就能运行 3.包括疲劳检测(打哈欠,低头,闭眼),人脸…...

基于docker安装MySQL、RabbitMQ、ElasticSearch、minio

MySQL 拉取镜像 docker pull mysql:5.7进入到/usr/mysql/conf目录下 cd /usr/mysql/conf创建文件 vi my.cnf插入以下内容 [client] default_character_setutf8 [mysqld] collation_server utf8_general_ci character_set_server utf8保存退出 在该目录(/usr…...

Rednote推行全球化战略:数据分离、服务条款差异,国际业务布局几何?

Rednote的全球化目标与初步举措去年在“TikTok难民”潮流中短暂成名的中国应用Rednote,立志成为全球社交媒体巨头。《连线》杂志发现,随着业务拓展,该公司正逐步将中国和国际用户群体区分开来。Rednote近期推出了新的网络域名Rednote.com&…...

科技史上的今天:4月23日

今天是4月23日,在科技发展的长河中,这一天见证了多个里程碑式的时刻,从物理学的奠基到航空工业的突破,再到互联网时代的商业博弈。以下是发生在今天的四件科技大事。 量子力学之父普朗克诞生 1858年的今天,德国物理学…...

索尼相机功能终极解锁指南:OpenMemories-Tweak完全教程

索尼相机功能终极解锁指南:OpenMemories-Tweak完全教程 【免费下载链接】OpenMemories-Tweak Unlock your Sony cameras settings 项目地址: https://gitcode.com/gh_mirrors/op/OpenMemories-Tweak 索尼相机功能扩展工具OpenMemories-Tweak是一款专为索尼相…...

AI经验存共享平台,躺着赚睡后收入

你有没有想过,那些熬了无数个夜、踩过无数个坑才总结出的AI开发经验,其实可以变成一份帮你赚取‘睡后收入’的资产?你有没有过这种经历?做 AI 开发,踩了一堆坑,熬了好几个夜,总结了一堆经验&…...

USB摄像头热拔插导致应用卡死?手把手教你用select给V4L2的DQBUF加超时保护

USB摄像头热拔插导致应用卡死?手把手教你用select给V4L2的DQBUF加超时保护 在嵌入式Linux和Android HAL开发中,USB摄像头热拔插导致的应用程序卡死是一个常见但令人头疼的问题。想象一下这样的场景:你的应用程序正在流畅地预览摄像头画面&…...

PyTorch CUDA检查报‘out of memory’?一个关于`PYTORCH_NVML_BASED_CUDA_CHECK`的避坑指南

PyTorch CUDA检查报‘out of memory’?深入解析PYTORCH_NVML_BASED_CUDA_CHECK的避坑指南 当你面对一台配置了多张NVIDIA 4090显卡的服务器,nvidia-smi显示显存充足,但PyTorch的torch.cuda.is_available()却返回False并报出"out of memo…...

告别CANTP配置恐惧症:手把手教你用Vector CANoe搭建UDS诊断通信环境(附实战Demo)

从零构建UDS诊断通信环境:Vector CANoe实战指南与避坑手册 第一次打开Vector CANoe的CANTP配置界面时,那些密密麻麻的参数和陌生的缩写词是否让你感到无从下手?N_PDU类型、BS/STmin参数、流控帧配置……这些概念在文档里看起来简单&#xff0…...

PyTorch模型加载翻车实录:遇到‘Missing keys’或‘Unexpected keys’报错怎么办?(附排查脚本)

PyTorch模型加载翻车实录:遇到‘Missing keys’或‘Unexpected keys’报错怎么办? 当你满怀期待地运行model.load_state_dict(torch.load(checkpoint.pth)),准备加载预训练模型时,终端却突然抛出令人困惑的Missing keys或Unexpec…...

终极指南:Windows Cleaner如何快速解决C盘爆红问题

终极指南:Windows Cleaner如何快速解决C盘爆红问题 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你是否也曾经历过这样的焦虑时刻?电脑运…...

保姆级教程:用Python+ANSYS Workbench复现电机定子模态仿真(附避坑点)

PythonANSYS Workbench电机定子模态仿真全流程解析与实战避坑指南 电机定子的模态分析是NVH(噪声、振动与声振粗糙度)性能优化的核心环节。本文将手把手带你用Python脚本预处理电磁力数据,并通过ANSYS Workbench完成从几何建模到模态结果验证…...

别再死记硬背了!用Python+LTspice仿真,5分钟搞懂RC/RL滤波电路截止频率

用PythonLTspice仿真5分钟掌握RC/RL滤波电路截止频率 在电子工程的学习中,RC和RL滤波电路是最基础也最重要的概念之一。传统的学习方法往往要求学生死记硬背截止频率公式,这不仅枯燥乏味,也难以真正理解电路行为的本质。本文将介绍一种全新的…...

MySQL篇01-为什么MySQL默认引擎为Innodb

✅前言在学学习MySQL时同学们可能会有疑问,MySQL引擎是什么东西?这些引擎有什么用途和区别?我要怎么选择这些引擎?接下来我将让大家明白为什么innodb是默认引擎。 ✅引擎分类引擎特点InnoDBACID事物,行极锁&#xff0c…...