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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 01:27:09