You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何区分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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 10:06:22