动态模块没有定义模块导出函数(PyInit_example)

Dynamic module does not define module export function(PyInit_example)

我最近使用 swig.

python 构建了一个 C 扩展

起初,我 运行 :

swig -python example.i

然后生成了example.py & example_wrap.c

我运行之后:

gcc -c example.c example_wrap.c -I D:/path_to_python/Python/include

好的,然后它生成了对象 example.o & example_wrap.o

在我想创建一个共享目标文件之后 运行 :

gcc -o example.dll -s -shared example.o -Wl,--subsystem,windows

生成了example.dll。 我将 example.dll 的扩展名重命名为 example.pyd。然后将 example.pyd & example.py 分别复制并粘贴到 Python\DLLs & Python\Lib 文件夹。

直到一切顺利。 但是当我打开 python.exe 并写入 import example 时发生错误。它说:

Dynamic module does not define module export function(PyInit_example).

我尝试了各种方法但没有用。我想从 .dll.

生成 .pyd

我用过:

-Windows 10

-Python310

-GCC MinGW 64

感谢那些帮助过我的人。

最终名称应为_example.pyd(带下划线)。您 import example 加载生成的 example.py,然后 import _example 并加载 _example.pyd。无需将任何内容复制到 Python 子目录中。

确保 example.i 文件以 %module example 开头。

我没有安装 MingGW,但这是使用 VS2019 构建的命令行:

example.i

%module example

%inline %{
int add(int a, int b) {
    return a + b;
}
%}

演示如下。注意 /Fe 命名输出文件,/LD 创建一个 DLL。

C:\demo>swig -python example.i

C:\demo>cl /LD /Fe_example.pyd /Ic:\python38\include example_wrap.c -link -libpath:c:\python38\libs
Microsoft (R) C/C++ Optimizing Compiler Version 19.29.30136 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

example_wrap.c
Microsoft (R) Incremental Linker Version 14.29.30136.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/dll
/implib:_example.lib
/out:_example.pyd
-libpath:c:\python38\libs
example_wrap.obj
   Creating library _example.lib and object _example.exp

C:\demo>py
Python 3.8.10 (tags/v3.8.10:3d8993a, May  3 2021, 11:48:03) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import example
>>> example.add(5,6)
11

这是我对 MingGW 的最佳猜测(未经测试,因为我没有安装它):

swig -python example.i
gcc -c -fpic example.c example_wrap.c -Ipython3.9
gcc -shared example.o example_wrap.o -o _example.pyd