使用D语言Pyd+Dub+LDC2构建Python扩展遇PyInit_hello导出问题
问题分析与解决方案
针对你遇到的ImportError: dynamic module does not define module export function (PyInit_hello)问题,结合你的配置和代码,主要有以下几个问题需要修正:
1. Dub配置文件语法错误
你的dub.sdl最后一行存在语法错误,缺少闭合引号,导致Dub无法正确解析链接库配置:
# 错误行 libs "python313" platform="windows # 修正后 libs "python313" platform="windows"
2. Windows平台下函数导出不完整
在Windows系统中,仅使用export extern(C)不足以确保PydMain函数被正确导出到动态库中,需要添加__declspec(dllexport)标记。同时显式指定模块名给module_init,确保生成对应名称的导出函数:
module hello; import pyd.pyd; import std.stdio; void hello() { writefln("Hello, world!"); } // 添加__declspec(dllexport)确保Windows下正确导出 export extern(C) __declspec(dllexport) void PydMain() { def!(hello); // 显式传递模块名,保证生成PyInit_hello导出函数 module_init("hello"); }
3. 验证Pyd版本兼容性
确认你使用的pyd 0.14.5版本是否支持Python 3.13。如果该版本不兼容Python 3.13,建议升级到pyd的最新版本,或者降级Python到pyd官方支持的版本(如3.12)。
4. 构建时的环境变量传递优化
你可以直接在dub.sdl中添加Python头文件路径配置,避免依赖批处理中的环境变量,确保Dub编译时能正确找到Python头文件:
dflags "-I=C:\\Dev\\Python313\\include" platform="windows"
验证修复效果
修改完成后重新执行build.bat,此时dumpbin /exports hello.dll | findstr PyInit_hello应该能输出PyInit_hello的导出信息,复制文件到site-packages目录后即可正常导入模块。
内容的提问来源于stack exchange,提问作者Sam Saint-Pettersen
相关产品推荐
相关产品推荐

