如何区分os.popen执行mdls的正常版本输出与‘未找到’错误输出?
解决MacOS下通过mdls获取应用版本时的错误判断问题
问题场景
编写Python脚本调用MacOS的mdls命令,读取/Applications目录下应用的版本号;若目标程序未找到,输出“[程序]未安装”。但使用os.popen时无法区分正常版本输出与“could not find [程序名]”的错误输出,现有字符串匹配逻辑无效,需要可靠的判断方案。
解决方案
使用subprocess模块替代os.popen,该模块可以分离捕获命令的标准输出、标准错误,还能获取命令的退出状态码,是处理外部命令调用的标准方式,判断逻辑更稳定。
修改后的代码
import subprocess def grab_version(target_app): app_path = f"/Applications/{target_app}.app" # 调用mdls命令,捕获输出和返回码 result = subprocess.run( ["mdls", "-raw", "-name", "kMDItemVersion", app_path], capture_output=True, text=True ) if result.returncode != 0: # 返回码非0表示命令执行失败(如文件未找到) print(f"{target_app} 未安装") else: # 去掉版本号前后的换行符,输出结果 version = result.stdout.strip() print(f"{target_app} 已安装,版本: {version}") # 测试调用 grab_version("Slack")
关键说明
subprocess.run()的capture_output=True参数会同时捕获标准输出(stdout)和标准错误(stderr);text=True确保输出以字符串形式返回,无需手动解码。- 通过
result.returncode判断命令执行状态:mdls成功获取版本时返回0,找不到目标应用时返回非0(通常为1),这种方式比匹配错误字符串更可靠,不受系统语言或错误信息格式变化影响。 - 用
strip()处理版本号,去除多余的换行符,保证输出格式整洁。
内容的提问来源于stack exchange,提问作者GooseAtCompany
相关产品推荐
相关产品推荐

