C Python扩展调用时报模块无自定义Custom属性问题求助
排查解决步骤
1. 移除冗余的PyImport_AddModule调用
PyImport_AddModule("custom")的逻辑是:如果sys.modules中不存在custom模块,就直接创建一个空的内置模块对象注册进去,不会加载磁盘上的.pyd扩展文件。后续执行import custom时,Python会优先复用sys.modules中已存在的空模块,自然找不到你定义的Custom类型,这和你看到的模块FILE字段显示(built-in)的现象完全匹配。
直接删除PyImport_AddModule("custom")这行代码即可,让PyRun_SimpleString中的import custom逻辑自动去磁盘查找加载编译好的.pyd文件。
2. 校验路径与版本一致性
如果删除上述代码后仍报错,按以下项逐一核对:
- 确认嵌入Python运行时的
sys.path配置正确,可在Py_Initialize()之后添加一行代码打印运行时路径对比:
确保PyRun_SimpleString("import sys\nprint('runtime sys.path:', sys.path)");.pyd文件所在目录确实在输出的路径列表中。 - 确认编译生成的
.pyd文件名为custom.pyd,如果生成的是带版本标识的名称(例如custom.cp38-win_amd64.pyd),要么重命名为custom.pyd,要么调整import语句对应实际文件名。 - 确认CMake中配置的
PYTHON_BIN版本,和你嵌入程序链接的Python运行时版本完全一致,跨版本编译的扩展无法被正常加载。
3. 验证扩展本身正确性
如果上述配置都无问题,单独校验扩展模块:
- 打开对应版本的Python终端,切换到
.pyd所在目录,执行import custom; print(dir(custom)),确认输出列表中存在Custom类,排除C扩展代码编写错误的可能。 - 确认C代码中的模块初始化函数命名符合规范:Windows平台Python 3.8的扩展初始化函数必须为
PyInit_custom,且你已经通过PyModule_AddObject将Custom类型正确注册到了模块对象中。
内容的提问来源于stack exchange,提问作者adub
相关产品推荐
相关产品推荐

