从setup.py迁移到pyproject.toml后Python C扩展无法导入
问题解决指南
核心问题:模块命名与导入路径不匹配
你在pyproject.toml中定义的扩展模块名为mylib.spam,这意味着它是mylib包下的子模块,而非顶级模块spam。直接执行import spam自然找不到模块,正确的导入方式是import mylib.spam。
完整修复步骤
1. 完善包结构
在src/mylib目录下创建空的__init__.py文件,让Python识别mylib为合法包:
touch src/mylib/__init__.py
2. 验证导入
安装开发版后,执行以下命令测试:
import mylib.spam # 调用模块内的函数,例如 spam.system("echo hello")
(可选)恢复顶级模块spam的导入方式
如果希望保持原来直接import spam的习惯,可修改pyproject.toml配置,移除包层级:
#pyproject.toml [build-system] requires = ["setuptools"] build-backend = "setuptools.build_meta" [project] name = "mylib-spam" version="0.42" [tool.setuptools] ext-modules = [ {name = "spam", sources = ["src/spammodule.c"]} ]
同时删除src/mylib目录,编译后的模块会直接作为顶级模块安装,即可用import spam导入。
补充说明
编译时出现的No such file or directory错误,是因为setuptools尝试将编译好的扩展复制到src/mylib目录但该目录不存在,手动创建目录的操作是正确的。
内容的提问来源于stack exchange,提问作者Frederic Peugny
相关产品推荐
相关产品推荐

