使用Setuptools打包含动态共享库的Python包无法正确导入求助
问题原因分析
- 导入包名和
setup.py的name字段无直接关联:name仅为pip索引、列表显示的包标识,实际可导入的包名由packages参数中指定的文件夹名决定,当前配置中packages=['libmypackage'],所以仅能导入libmypackage,无法导入mypackage。 package_data文件名配置错误:实际的动态库文件名为libmypackage.so,但配置中写的是libspylizard.so,导致安装时动态库未被打包进安装目录,导入后自然没有对应内容。__init__.py导入路径错误:from libmypackage import *是搜索全局顶层的libmypackage包,不是当前包目录下的libmypackage.so文件,需要使用相对导入。
修复步骤
- 调整文件夹结构,将
libmypackage文件夹重命名为mypackage,实现import mypackage的导入需求,调整后结构如下:
project + setup.py + mypackage + __init__.py + libmypackage.so
- 修改
setup.py配置,修正包名和动态库文件名:
from setuptools import setup setup( name='mypackage', version='1.0', packages=['mypackage'], package_data={'mypackage': ['libmypackage.so']}, include_package_data = True, )
- 修改
mypackage/__init__.py内容,使用相对导入导出动态库的所有内容:
# 相对导入当前目录下的libmypackage.so的所有符号 from .libmypackage import * # 可按需添加__all__明确导出的符号列表,避免导入不必要的内容 # __all__ = ["your_function_name", "your_class_name"]
验证方法
- 先卸载旧版本的包:
pip uninstall -y mypackage - 重新执行安装:
python setup.py install --user - 打开Python交互终端执行
import mypackage,即可直接通过mypackage.xxx调用动态库中的接口。
内容的提问来源于stack exchange,提问作者hamid badi
相关产品推荐
相关产品推荐

