使用 python CDLL 加载 dll,但没有出现来自 c 代码的函数
Using python CDLL to load dll, but no function from c code show up
我正在尝试将用 C 代码编写的函数导入 python。我试过的一个最小的例子是
//test.h
__declspec(dllexport) int HW(int, int);
//test.c
#include <stdio.h>
#include <stdlib.h>
#include "test.h"
__declspec(dllexport) int HW(int a, int b)
{
return a + b;
}
我还尝试删除任一文件中的 __declspec(dllexport)
。然后我在 Visual Studio 2019 CMD
中做了以下操作
cl /LD test.c
或
cl /LD test.c \libs\python37.lib
在python我做到了
from ctypes import *
a = CDLL('test.dll')
原来HW不是a的属性。我哪里做错了?
您至少需要以下代码。 test.h
不需要导出函数,也没有使用其他包含。
__declspec(dllexport) int HW(int a, int b)
{
return a + b;
}
使用 cl /LD test.c
(Microsoft) 编译。 python 库不是必需的。如果使用 32 位 Python,请确保使用 32 位编译器;如果使用 64 位 Python.
,请确保使用 64 位编译器
使用演示:
>>> from ctypes import *
>>> a = CDLL('./test')
>>> a.HW
<_FuncPtr object at 0x000001E44AB7BA00>
>>> a.HW(1,2)
3
请注意,在您访问函数一次之前,您不会通过检查(即 dir(a)
)看到这些函数:
>>> from ctypes import *
>>> a = CDLL('./test')
>>> dir(a)
['_FuncPtr', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattr__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_func_flags_', '_func_restype_', '_handle', '_name']
>>> a.HW
<_FuncPtr object at 0x0000020A92B7B930>
>>> dir(a)
['HW', '_FuncPtr', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattr__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_func_flags_', '_func_restype_', '_handle', '_name']
我正在尝试将用 C 代码编写的函数导入 python。我试过的一个最小的例子是
//test.h
__declspec(dllexport) int HW(int, int);
//test.c
#include <stdio.h>
#include <stdlib.h>
#include "test.h"
__declspec(dllexport) int HW(int a, int b)
{
return a + b;
}
我还尝试删除任一文件中的 __declspec(dllexport)
。然后我在 Visual Studio 2019 CMD
cl /LD test.c
或
cl /LD test.c \libs\python37.lib
在python我做到了
from ctypes import *
a = CDLL('test.dll')
原来HW不是a的属性。我哪里做错了?
您至少需要以下代码。 test.h
不需要导出函数,也没有使用其他包含。
__declspec(dllexport) int HW(int a, int b)
{
return a + b;
}
使用 cl /LD test.c
(Microsoft) 编译。 python 库不是必需的。如果使用 32 位 Python,请确保使用 32 位编译器;如果使用 64 位 Python.
使用演示:
>>> from ctypes import *
>>> a = CDLL('./test')
>>> a.HW
<_FuncPtr object at 0x000001E44AB7BA00>
>>> a.HW(1,2)
3
请注意,在您访问函数一次之前,您不会通过检查(即 dir(a)
)看到这些函数:
>>> from ctypes import *
>>> a = CDLL('./test')
>>> dir(a)
['_FuncPtr', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattr__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_func_flags_', '_func_restype_', '_handle', '_name']
>>> a.HW
<_FuncPtr object at 0x0000020A92B7B930>
>>> dir(a)
['HW', '_FuncPtr', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattr__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_func_flags_', '_func_restype_', '_handle', '_name']