使用SWIG与Setuptools构建Python包时的扩展打包异常问题
问题修复方案
你的核心问题是setup.py存在几处配置错误,导致setuptools无法自动触发SWIG处理,也没正确打包扩展模块。以下是分步修复步骤:
1. 修正setup.py配置
恢复注释掉的Extension配置(这是让setuptools自动调用SWIG的关键,setuptools会识别.i文件并自动生成包装代码),同时修正setup函数的错误参数:
from setuptools import setup, Extension, find_packages # 启用该配置,让setuptools自动处理SWIG my_module = Extension('_MyModule', sources=['myPackage/my_interface.i'], swig_opts=["-c++", "-ImyPackage"], library_dirs=['myPackage'], libraries=["my_lib"], include_dirs=['myPackage'] ) setup( name='MyPackage', version='1.0', author="", description="SWIG wrapper", ext_modules=[my_module], # 自动发现所有Python包,替代手动拼写的packages参数 packages=find_packages(), # 打包需要的非Python文件 package_data={"myPackage": ["my_dll.dll", "my_lib.lib"]}, # 确保非Python文件被正确安装 include_package_data=True )
关键修正点:
- 用
.i文件作为Extension的sources:setuptools会自动执行swig -c++ -python -ImyPackage myPackage/my_interface.i,生成C++包装代码和对应的Python模块。 - 移除错误的
py_modules = ["myModule.myModule"]:该路径不符合SWIG生成的模块结构,find_packages()会自动包含生成的Python模块。 - 修正
package=["myPackage"]为packages=find_packages():原参数拼写错误(应为复数packages),find_packages()能自动识别包结构更可靠。
2. 配置MANIFEST.in
确保源码分发包包含所有依赖文件,在MANIFEST.in中添加:
include myPackage/*.i include myPackage/*.hpp include myPackage/*.dll include myPackage/*.lib
这能避免python -m build生成源码包时遗漏关键文件。
3. 确保pyproject.toml配置正确
pyproject.toml需要指定构建依赖,保证setuptools和wheel可用:
[build-system] requires = ["setuptools>=61.0", "wheel"] build-backend = "setuptools.build_meta"
4. 执行构建
直接运行以下命令,setuptools会自动完成SWIG处理、扩展编译和打包:
python -m build
5. 验证安装
用pip安装生成的包测试:
pip install dist/MyPackage-1.0-py3-none-any.whl
之后在Python中导入验证:
import myPackage # 根据你的SWIG接口定义调用对应功能即可
内容的提问来源于stack exchange,提问作者Thombou
相关产品推荐
相关产品推荐

