py2app全量打包时报错找不到zmq/.dylibs目录如何解决
报错原因说明
py2app全量打包时尝试查找的是pyzmq(Python的zmq绑定库)包内用于存放私有动态链接库的.dylibs目录——macOS平台下很多Python二进制包会把自身依赖的、不对外暴露的.dylib动态库存放在包目录下的.dylibs文件夹中,py2app在全量打包阶段会遍历所有依赖包,自动收集该目录下的动态库嵌入应用包,避免应用运行时找不到依赖。
带-A参数的别名模式不会复制任何依赖文件,只是在生成的应用包内创建指向本地Python环境的软链接,因此不会触发目录扫描逻辑,能正常运行。你当前使用的Anaconda环境安装的pyzmq没有按通用Python包规范在包目录下创建.dylibs目录,相关依赖动态库被放在Anaconda全局的lib路径下,才会触发路径不存在的报错。
可落地的解决方法
- 快速修复:手动创建缺失的空目录
直接执行以下命令在报错提示的zmq包路径下新建空的.dylibs目录即可跳过py2app的路径检查:mkdir -p /Users/Kenan/opt/anaconda3/lib/python3.9/site-packages/zmq/.dylibs
该操作不会影响pyzmq的正常运行,py2app后续会自动从Anaconda的全局lib路径扫描到zmq相关的依赖动态库,完成打包流程。 - 规避环境兼容问题:使用独立虚拟环境打包
Anaconda环境的Python包目录结构和标准pip安装的包结构存在较多定制化差异,很容易触发打包工具的路径扫描bug。可以使用官方发行的Python版本创建独立的venv虚拟环境,在虚拟环境内通过pip安装所有项目依赖和py2app后再执行全量打包,能避免绝大多数类似的路径问题。 - 冗余依赖排除(仅当项目未直接使用zmq时使用)
如果你的业务代码没有主动引入zmq,pyzmq是其他第三方依赖间接带入的冗余包,可以在项目的setup.py配置中把zmq加入py2app的排除列表,配置示例如下:from setuptools import setup APP = ['main.py'] # 替换为你自己的应用入口文件路径 DATA_FILES = [] OPTIONS = { 'excludes': ['zmq'], } setup( app=APP, data_files=DATA_FILES, options={'py2app': OPTIONS}, setup_requires=['py2app'], )
内容的提问来源于stack exchange,提问作者Kenan Bateman
相关产品推荐
相关产品推荐

