PyInstaller打包Python2.7脚本getattr(sys,'frozen',False)不生效问题
PyInstaller打包后未进入sys.frozen判断分支问题解答
核心原因
你观察到的「未进入if分支」是假象,实际问题是getattr(sys, 'frozen', False)判断成立、进入分支后,分支内部代码执行抛出异常,且异常被外层try块捕获后无任何日志输出,导致程序直接静默退出,getattr(sys, 'frozen', False)本身功能正常。
问题根因拆解
你提供的脚本1代码中,add_config函数内的try块完整包裹了frozen判断逻辑,且你没有补充except分支的错误捕获输出逻辑:一旦分支内你标注为<some code>的部分执行出错,异常会被直接吞掉,不会打印任何错误提示,你自然看不到分支内的版本、序列号打印内容,误以为没有进入分支。
排查方案
你可以通过修改代码输出异常详情快速定位具体报错点,示例修改如下:
import sys import traceback def add_config(): print("[+] Entered Add_config") try: if getattr(sys, 'frozen', False): # 你的原有业务代码 <some code..> print("[+] Version:") print(<some code>) print("[+] Serial:") print(<some code>) # 新增异常捕获逻辑 except Exception as e: print("[-] 分支内执行错误:%s" % str(e)) print("[-] 错误堆栈信息:") traceback.print_exc() if __name__ == "__main__": print("[+] Entered Main") add_config()
Mac + Python2.7 + PyInstaller3.6环境下常见的分支内报错场景
- 路径错误:打包后可执行文件的运行目录、内置资源路径和脚本直接运行时不同,若分支内有读取相对路径的配置、资源文件的逻辑,极易触发文件不存在异常
- 依赖缺失:如果分支内调用了PyInstaller未自动识别的第三方库、系统动态链接库,运行时会触发模块导入失败
- 权限限制:Mac系统安全机制会阻止普通可执行文件访问敏感目录、修改系统配置,若分支内涉及这类操作会触发权限报错
内容的提问来源于stack exchange,提问作者festivezine
相关产品推荐
相关产品推荐

