使用setuptools与SWIG构建Windows平台Python 3.6.4模块
在Windows上用setuptools构建Python 3.6.4的SWIG模块
我帮你把setup.py补全并优化,完美适配你的需求——自动处理所有SWIG接口文件,生成并打包所需的.py、.pyd和.pyc文件。下面是完整的实现:
from setuptools import setup, Extension from setuptools.command.build_ext import build_ext from pathlib import Path import shutil # 自动收集当前目录下所有SWIG接口文件 swig_files = list(Path('.').glob('*.i')) # 生成扩展模块和对应Python模块的配置 extensions = [] py_modules = [] for swig_file in swig_files: module_name = swig_file.stem # 扩展模块命名为_xxx(遵循SWIG默认生成规则,和自动生成的.py文件对应) ext = Extension( f'_{module_name}', sources=[str(swig_file)], swig_opts=['-python'] # 明确告诉SWIG生成Python绑定代码 ) extensions.append(ext) py_modules.append(module_name) # 自定义build_ext命令,确保SWIG生成的.py文件被正确纳入安装包 class CustomBuildExt(build_ext): def run(self): # 先执行默认的扩展编译流程(生成.pyd和临时的.py文件) super().run() # 将SWIG生成的.py文件从临时目录复制到最终构建目录 for ext in self.extensions: module_name = ext.name[1:] # 去掉扩展名前面的下划线 target_py = Path(self.build_lib) / f'{module_name}.py' temp_py = Path(self.build_temp) / f'{module_name}.py' if temp_py.exists() and not target_py.exists(): shutil.copyfile(temp_py, target_py) setup( name='your-swig-module', # 替换成你的模块名称 version='0.1.0', py_modules=py_modules, ext_modules=extensions, cmdclass={'build_ext': CustomBuildExt}, # 配置安装时自动生成.pyc文件 options={ 'install': {'optimize': 1}, # 1生成普通pyc,2生成优化版pyc,0不生成 }, )
关键部分拆解
- 自动收集SWIG文件:用
Path.glob批量扫描.i文件,不用手动逐个添加,后续新增接口文件也不用改代码。 - Extension配置:每个接口对应一个命名为
_模块名的扩展,和SWIG自动生成的.py文件的调用逻辑匹配,避免导入错误。 - 自定义build_ext:默认情况下SWIG生成的
.py文件会留在临时构建目录,这个自定义命令会把它复制到最终目录,确保安装时能一起打包。 - py_modules指定:告诉setuptools要安装这些SWIG生成的
.py文件,不会遗漏。 - optimize选项:设置为1会让setuptools在安装时自动编译生成
.pyc文件,满足你的需求。
Windows平台必看注意事项
- 编译器环境:Python 3.6.4在Windows上必须用Visual Studio 2015(或对应的Build Tools)编译扩展。安装后要打开对应位数的命令提示符(比如
x64 Native Tools Command Prompt for VS 2015)再执行安装命令,否则会编译失败。 - SWIG安装:确保SWIG已安装,且其可执行文件路径已加入系统
PATH,这样setuptools能找到swig.exe处理接口文件。 - 执行安装:在命令提示符里运行:
要是想生成可分发的wheel包,就运行:python setup.py installpython setup.py bdist_wheel
安装完成后,去Python的site-packages目录检查,你会看到对应的.py、.pyd文件,以及__pycache__目录下的.pyc文件,说明构建成功了。
内容的提问来源于stack exchange,提问作者cs-
相关产品推荐
相关产品推荐

