使用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加载时找不到匹配的导出函数。解决方法:
- 直接使用原始文件名:保留Nuitka生成的原始文件名
get_slices_from_camCalib_apex.cp311-win_amd64.pyd,导入语句用import get_slices_from_camCalib_apex(无需带后缀)。 - 指定目标模块名构建:如果必须使用自定义文件名,构建时通过Nuitka的
--module-name参数指定模块名,让Nuitka生成匹配的导出函数。修改后的构建命令为:
构建完成后会直接生成目标文件名的.pyd文件,且内部导出函数名匹配,导入时用nuitka --module --module-name=getSlicesFromCamCalibApexCp311winAmd64 --debug --msvc=latest --disable-ccache get_slices_from_camCalib_apex.pyimport getSlicesFromCamCalibApexCp311winAmd64即可。
- 直接使用原始文件名:保留Nuitka生成的原始文件名
内容的提问来源于stack exchange,提问作者BiggerB2008
相关产品推荐
相关产品推荐

