如何修改setup.py以包含Swig绑定流程并创建依赖共享库的Pip包
解决Swig绑定的Pip打包问题
你不需要手动复制共享对象文件,应该让setuptools自动处理Swig绑定的生成、编译和打包流程。以下是修改后的setup.py,包含完整的Swig集成逻辑:
import setuptools from setuptools import Extension import sys # 定义Swig扩展模块 example_ext = Extension( name='_example', # 需与Swig生成的.py文件中导入的共享库名称一致 sources=[ 'src/example.i', # Swig接口文件的实际路径 'src/example.cpp' # 你的C++源文件,多文件可继续添加至列表 ], swig_opts=['-c++', '-py3'], # 指定处理C++代码,生成Python3兼容绑定 extra_compile_args=['-std=c++11'] if sys.platform != 'win32' else ['/std:c++11'], # 适配不同系统的C++编译标准 ) setuptools.setup( name='example', version='0.0.1', author='me', description='brief description', keywords='example, pypi, package', long_description=open('README.md').read(), long_description_content_type='text/markdown', url='repo.com', project_urls={ 'Documentation': 'docs.com', 'Bug Reports':'repo/issues.com', 'Source Code': 'repo.com', }, # 保留Python API文件的位置配置(如果你的.py文件确实在Python目录下) package_dir={'': 'Python'}, packages=setuptools.find_packages(where='Python'), ext_modules=[example_ext], # 核心:将扩展模块纳入打包流程 classifiers=[ 'Development Status :: 5 - Production/Stable', 'Intended Audience :: Developers', 'Topic :: Software Development :: Build Tools', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3 :: Only', 'Operating System :: POSIX :: Linux', 'Operating System :: MacOS :: MacOS X', 'Operating System :: Microsoft :: Windows', ], python_requires='>=3.6', )
关键修改说明:
- 引入
Extension类:用来定义C扩展模块,将Swig接口文件和C源文件纳入自动编译流程。 - 添加
swig_opts参数:-c++指定Swig处理C++代码,-py3确保生成Python3兼容的绑定代码。 - 新增
ext_modules参数:把定义好的扩展模块传给setup函数,setuptools会自动完成Swig绑定生成、编译共享对象、打包进Pip包的全流程。 - 移除
package_data配置:不再需要手动指定.so文件路径,编译后的共享对象会被自动识别并打包。
额外注意事项:
- 编译环境需提前安装Swig(可在项目requirements中添加
swig,或要求用户手动安装)。 - 根据项目实际路径调整
sources列表中的文件路径。 - 如果有多个C++源文件,全部添加至
sources列表即可。
内容的提问来源于stack exchange,提问作者aaries
相关产品推荐
相关产品推荐

