setup.py配置:Python打包wheel未包含共享库.so的解决方法
问题原因
setuptools 默认只会自动收集Python包目录下的.py源码文件,.so这类二进制产物不在默认打包范围内。你当前的setup.py没有显式声明需要包含共享库文件,因此最终生成的wheel包会漏掉mypack/sub_pack2/shared_library.so。
适配当前场景的解决方案
你现在是提前通过外部流程构建好so文件,只需要把现成产物打进wheel,直接修改setup.py添加package_data配置,显式指定子包内需要打包的非源码文件即可,修改后的完整配置如下:
from setuptools import setup, find_packages setup( name = "mypack", version = "1.0", author = "Bill Coder", author_email = "bill.coder@email.com", description = "My Code", packages=find_packages(), package_data={ # 指定mypack.sub_pack2包下所有后缀为.so的文件都要打包 "mypack.sub_pack2": ["*.so"], }, long_description="Long description", )
注意事项:
- 配置里的包名
mypack.sub_pack2必须和实际目录名完全一致,你贴的文件结构里sub_pack2行末尾漏了路径斜杠,注意不要把目录名误写为subpack2之类的错误名称。 - 重新构建前先清理旧的构建缓存,删除项目根目录下的
build/、dist/、*.egg-info文件夹,避免旧缓存导致打包结果异常。
构建完成后可以用以下命令验证wheel包内是否包含目标文件:
unzip -l dist/mypack-1.0-*.whl | grep shared_library.so
命令输出如果存在mypack/sub_pack2/shared_library.so路径,就说明打包成功。
可选:集成Cython编译流程
如果后续你想省掉外部预编译so的步骤,直接在setup流程里完成cythonize编译+打包,可以把Cython扩展配置直接写进setup.py,参考配置如下:
from setuptools import setup, find_packages, Extension from Cython.Build import cythonize # 配置要编译的Cython扩展 ext_modules = cythonize([ Extension( "mypack.sub_pack2.shared_library", ["mypack/sub_pack2/对应源码文件.pyx"] ) ]) setup( name = "mypack", version = "1.0", author = "Bill Coder", author_email = "bill.coder@email.com", description = "My Code", packages=find_packages(), ext_modules=ext_modules, long_description="Long description", )
用这个配置执行构建命令时,会自动完成pyx文件到so的编译,并且自动把生成的so纳入wheel包,不需要额外配置package_data,适合后续CI流程优化使用。
内容的提问来源于stack exchange,提问作者user422005
相关产品推荐
相关产品推荐

