You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 14:30:02