使用py2app打包Python应用运行报错:ImportError: cannot import name py31compat
解决py2app打包含Jira模块应用时的
ImportError: cannot import name py31compat问题 我之前也碰到过几乎一模一样的情况——py2app打包过程顺利,但运行生成的应用直接崩溃,错误根源就是依赖模块的导入问题。从你的错误栈来看,问题出在pkg_resources里的py31compat模块找不到,这大概率是py2app没自动检测到动态导入的依赖,或者工具版本兼容冲突导致的。下面是几个亲测有效的解决步骤:
1. 手动指定隐藏导入的模块
py2app有时无法识别一些动态加载的依赖,比如Jira模块依赖的pbr库,以及pkg_resources的兼容性组件。你需要修改setup.py的OPTIONS配置,把这些缺失的模块手动加进去:
OPTIONS = { 'hiddenimports': ['pkg_resources.py31compat', 'pbr'], }
修改后的完整setup.py示例:
from setuptools import setup APP = ['DataCollector.py'] DATA_FILES = [] OPTIONS = { 'hiddenimports': ['pkg_resources.py31compat', 'pbr'], } setup( app=APP, data_files=DATA_FILES, options={'py2app': OPTIONS}, setup_requires=['py2app'], version='0.2beta', packages=[], license='', long_description=open('README.md').read(), install_requires=[ 'texttable', 'python-dateutil', 'datetime', 'pytz', 'pprint', 'jira', 'argparse' ] )
2. 升级相关工具到最新版本
旧版本的setuptools、py2app或者Jira依赖库可能存在兼容性漏洞,先执行升级命令确保所有工具都是最新状态:
pip install --upgrade setuptools py2app jira pbr
3. 清理缓存后重新打包
之前的打包缓存可能残留了旧的依赖文件,导致问题反复出现。先彻底删除缓存和旧产物,再重新执行打包命令:
rm -rf build dist __pycache__ python setup.py py2app
4. 先验证开发环境的运行状态
在打包前,先确保你的脚本在本地开发环境能正常运行,排除代码本身的逻辑问题:
python DataCollector.py
按照这几步操作后,应该就能解决那个导入错误,让打包后的应用正常启动运行了。
内容的提问来源于stack exchange,提问作者John Snow
相关产品推荐
相关产品推荐

