使用SWIG、C和setuptools构建Hello World模块时遇导入错误
解决SWIG+setuptools导入模块时的PyInit_hello错误
问题原因
出现ImportError: dynamic module does not define module export function (PyInit_hello)是因为setuptools未自动调用SWIG处理.i接口文件,直接将其当作普通C源编译,导致缺失Python 3要求的模块初始化函数,也未生成必要的Python绑定代码。
解决方案
1. 确保系统已安装SWIG
根据操作系统安装SWIG:
- Ubuntu/Debian:
sudo apt install swig - macOS(Homebrew):
brew install swig - Windows:下载SWIG二进制包并添加到系统PATH
2. 修改pyproject.toml配置
更新[tool.setuptools]下的ext-modules,明确指定SWIG接口文件和编译选项:
[tool.setuptools] ext-modules = [ { name = "hello", sources = ["src/hc/hello.c"], swig_sources = ["src/hc/hello.i"], swig_opts = ["-python"] } ]
通过swig_sources告诉setuptools处理SWIG接口文件,swig_opts显式指定生成Python绑定(部分环境下可省略,显式添加更稳妥)。
3. 重新构建安装
清理旧构建文件后重新安装:
rm -rf build dist *.egg-info pip install -e .
验证
进入Python交互环境测试:
>>> import hello >>> hello.say_hello() Hello, World!
内容的提问来源于stack exchange,提问作者Utkonos
相关产品推荐
相关产品推荐

