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

使用Nuitka构建的Python扩展模块加载报错:PyInit_导出函数缺失求助

加载Nuitka构建的Python扩展模块时的导入错误问题

测试代码

我用于测试模块加载的代码如下:

import configparser
import os

import numpy as np
import cv2
from scipy.optimize import least_squares
from scipy import io
from pathlib import Path
import pandas as pd
import sys
import getSlicesFromCamCalibApexCp311winAmd64.pyd

我也尝试过不带.pyd后缀导入:import getSlicesFromCamCalibApexCp311winAmd64,但两种方式都报错。

报错信息

Traceback (most recent call last):
  File "C:/Test Eng/CyliteDevelopment/DLL/create_cameraGuidance/TestGetSlicesFromCamCalibApex.py", line 11, in <module>
    import getSlicesFromCamCalibApexCp311winAmd64.pyd
ImportError: dynamic module does not define module export function (PyInit_getSlicesFromCamCalibApexCp311winAmd64)

Nuitka版本与环境信息

nuitka  --version
2.1.5
Commercial: None
Python: 3.11.9 (tags/v3.11.9:de54cf5, Apr  2 2024, 10:12:12) [MSC v.1938 64 bit (AMD64)]
Flavor: CPython Official
Executable: C:\Users\LandrBa1\AppData\Local\Programs\Python\Python311\python.exe
OS: Windows
Arch: x86_64
WindowsRelease: 10
Version C compiler: C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.31.31103\bin\Hostx64\x64\cl.exe (cl 14.3).

构建步骤与问题

我使用以下命令构建模块:

nuitka --module --debug --msvc=latest --disable-ccache get_slices_from_camCalib_apex.py

构建完成后,生成的文件名为get_slices_from_camCalib_apex.cp311-win_amd64.pyd,我将其重命名为getSlicesFromCamCalibApexCp311winAmd64.pyd。

Python要求模块导出名为PyInit_getSlicesFromCamCalibApexCp311winAmd64的函数,但实际上这个函数不存在,因为原模块的导出函数是基于原文件名生成的PyInit_get_slices_from_camCalib_apex。


问题原因与解决方法

  • 核心原因:CPython的扩展模块(.pyd文件)的导出函数名严格与模块文件名绑定。Nuitka构建模块时,会根据输入的Python脚本文件名生成对应的PyInit_<模块名>导出函数。手动重命名.pyd文件后,模块内部的导出函数名并未同步修改,导致Python加载时找不到匹配的导出函数。

  • 解决方法:

    1. 直接使用原始文件名:保留Nuitka生成的原始文件名get_slices_from_camCalib_apex.cp311-win_amd64.pyd,导入语句用import get_slices_from_camCalib_apex(无需带后缀)。
    2. 指定目标模块名构建:如果必须使用自定义文件名,构建时通过Nuitka的--module-name参数指定模块名,让Nuitka生成匹配的导出函数。修改后的构建命令为:
      nuitka --module --module-name=getSlicesFromCamCalibApexCp311winAmd64 --debug --msvc=latest --disable-ccache get_slices_from_camCalib_apex.py
      
      构建完成后会直接生成目标文件名的.pyd文件,且内部导出函数名匹配,导入时用import getSlicesFromCamCalibApexCp311winAmd64即可。

内容的提问来源于stack exchange,提问作者BiggerB2008

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:52:44