Ubuntu下pip构建wheel时package_data存入purelib的原因及配置方法
问题解析与解决方案
核心原因:pip/wheel版本差异
你遇到的差异本质是工具链版本不同导致的行为区别:
- Ubuntu 22.04自带的pip 22.0.2搭配的wheel、setuptools版本较低,在处理你自定义的
BinaryDistribution(强制生成平台专属二进制包)时,对package_data的归类逻辑存在局限——会将这类资源文件放到*.data/purelib目录下。 - Anaconda使用的pip 23.3.1属于较新版本,配合更新的wheel/setuptools,已经修复了这个逻辑问题,会正确将
package_data中的文件直接放在对应包目录(pyfoo/)下。
解决方法
方法1:升级Ubuntu环境的工具链(推荐)
直接升级pip、wheel、setuptools到最新版本,就能让Ubuntu环境的打包行为和Anaconda/manylinux保持一致:
pip install --upgrade pip wheel setuptools
升级后重新执行pip wheel .,资源文件就会被正确放在pyfoo/目录下。
方法2:规范package_data路径写法(可选)
你当前package_data中写的./fooJSON路径带有./,虽然不影响功能,但属于非规范写法,建议改为相对于包目录的直接文件名,让配置更清晰:
package_data={ 'pyfoo' : ['fooJSON', 'fooJSON.exe'], },
关于Ubuntu的特殊性
这不是Ubuntu系统本身的问题,只是它作为长期支持版本,自带的软件包版本偏稳定保守,pip/wheel版本滞后于最新版,才出现了这种打包行为差异。只要升级工具链,就能消除这种区别。
内容的提问来源于stack exchange,提问作者Juan
相关产品推荐
相关产品推荐

