PyInstaller打包问题:Windows正常但Mac无法生成可用.app
这种跨平台编译的坑确实让人头大,我之前也踩过类似的模块导入导致Mac端崩溃的雷,给你几个具体的排查和解决方向:
先扒崩溃日志,精准定位错误
Mac程序崩溃后,系统会自动生成崩溃报告。你打开「控制台」应用(Launchpad里搜Console就行),在左侧栏的「用户报告」里找到对应.app的日志文件,里面会明确指出是哪个模块找不到、加载失败或者抛出了异常——这比瞎猜模块要靠谱得多。我之前碰到过numpy的某个底层依赖没被打包进去,日志里直接把问题点得明明白白。先确认本地脚本在Mac上能正常跑
别上来就打包,先在Mac的终端里直接运行你的Python脚本,确保脚本本身在Mac环境下能正常执行。毕竟有些模块在Windows和Mac上的路径处理、依赖逻辑不一样,可能脚本本身在Mac上跑就有问题,只是你之前没测试过。如果脚本本地跑都报错,那先把脚本的兼容性问题解决了再说打包。给.spec文件补全hiddenimports字段
PyInstaller有时候没法自动检测到动态导入的模块(比如用importlib动态加载的,或者某些第三方库的隐式依赖),这时候光靠pathex和datas根本不够。你得手动在.spec文件的Analysis部分添加hiddenimports参数,把崩溃日志里提到的缺失模块都加进去。举个例子:a = Analysis( ['your_main_script.py'], pathex=['/path/to/your/script/directory'], binaries=[], datas=[], hiddenimports=['missing_module_1', 'missing_module_2'], # 其他参数保持不变 )换个PyInstaller版本试试
你用的3.3.1版本确实有点老了,和Python3.6.3的兼容性可能存在一些已知bug。虽然你试过重装正式版和开发版,但可以试试更适配的版本——比如PyInstaller 3.6,这个版本对Python3.6的支持比较稳定;或者直接升级到4.x系列(注意4.x可能需要调整.spec文件的一些配置项,不过逻辑都比较好理解)。检查权限和路径问题
Mac的沙箱机制比Windows严得多,编译后的.app如果涉及读取外部文件,一定要用相对路径或者正确的绝对路径,别写死Windows的路径格式。另外,打包的时候尽量用普通用户权限,别用sudo,不然可能会导致生成的.app文件权限异常。还有,别把.app放在中文路径下,Mac对中文路径的兼容性偶尔会抽风。用调试模式打包,看实时报错
打包的时候加上--debug=all参数,生成带调试信息的.app。然后在终端里直接运行.app包里的可执行文件(比如./dist/your_app_name/your_app_name),这样就能看到程序启动时的实时日志,能清楚看到是在导入哪个模块的时候卡壳了。命令大概是这样:pyinstaller --debug=all your_script.py --onedir
内容的提问来源于stack exchange,提问作者code4days

