Python程序中调用外部命令与脚本的实现方法
在Python开发中,经常需要调用系统命令或第三方工具完成自动化任务。本文详细说明如何利用os.system快速执行简单命令,并重点演示subprocess模块的标准输出捕获、字符串解析及异步非阻塞运行机制,附带Windows磁盘空间检测实例,帮助开发者掌握跨进程交互的核心技巧。
一、使用os.system执行基础命令
os.system是Python内置模块提供的最简接口,适用于只需触发程序运行且无需获取返回结果的场景。例如调用已安装的外部下载工具:
import os
cmd = r'd:\tools\wget http://mirrors.sohu.com/nginx/nginx-1.13.9.zip'
os.system(cmd)
print('安装完毕')该方式存在两个显著限制:一是采用同步阻塞模式,Python脚本必须等待外部命令彻底执行完毕后才会继续向下运行;二是无法获取目标程序的执行结果或页面内容。若需突破这些限制,应切换至subprocess模块。
二、使用subprocess模块实现精准控制
第1步:准备执行环境
部分系统级命令(如Windows下的fsutil)可能需要管理员权限才能正常读取数据。建议在具备对应权限的控制台环境中运行脚本,以避免因权限不足导致的拒绝访问错误。
第2步:同步捕获命令输出
通过Popen类创建子进程,将stdout和stderr重定向至管道,即可在Python端直接读取原始字节流:
from subprocess import PIPE, Popen
proc = Popen(
'fsutil volume diskfree c:',
stdin=None,
stdout=PIPE,
stderr=PIPE,
shell=True
)
outinfo, errinfo = proc.communicate()communicate()方法会返回包含标准输出与标准错误内容的字节串。由于终端默认输出为机器码,需按系统编码进行解码。
第3步:解析与处理返回结果
解码后的字符串可通过文本分割提取关键数值。以磁盘剩余空间计算为例:
# 注意返回内容为bytes,需指定gbk解码(适配中文Windows)
outinfo = outinfo.decode('gbk')
errinfo = errinfo.decode('gbk')
# 将结果按行拆分
outputList = outinfo.splitlines()
# 提取首尾字段并进行清洗替换
free = int(outputList[0].split(':')[1].replace(',', "").strip().split(' ')[0])
total = int(outputList[1].split(':')[1].replace(',', "").strip().split(' ')[0])
percent = free / total
print('使用百分比:{:.2%}'.format(percent))
if percent < 0.1:
print('!!剩余空间告急!!!')
else:
print('剩余空间足够')该方法依赖特定语言的格式排版,若系统区域设置更改导致fsutil输出列顺序变化,需相应调整索引切片位置。
第4步:异步执行非阻塞任务
当仅需后台触发任务而不需等待完成时,可省略通信阻塞逻辑,让外部进程独立运行:
from subprocess import Popen
proc = Popen(
args='wget http://mirrors.sohu.com/nginx/nginx-1.13.9.zip',
shell=True
)
print('让他下载,我们先作其他的的事情')配合shell=True可直接调用系统Shell解释器,但需注意避免拼接不可信的用户输入以防止命令注入风险。
三、简要总结
掌握os.system的轻量级调用与subprocess的精细管道控制,能够满足绝大多数跨程序交互需求。根据是否需要实时输出、是否允许阻塞主线程,合理选择进程管理方式即可。
以上就是Python程序中调用其他程序的详细实现方法,更多关于Python进程管理与命令行操作技巧的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









