使用python CDLL加载dll,但c代码中没有函数显示
Posted
技术标签:
【中文标题】使用python CDLL加载dll,但c代码中没有函数显示【英文标题】:Using python CDLL to load dll, but no function from c code show up 【发布时间】:2020-06-05 19:03:16 【问题描述】:我正在尝试将用 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的属性。我做错了哪一部分?
【问题讨论】:
您是否尝试将 32 位 DLL 加载到 64 位 Python 中,反之亦然? 指定test.dll
的完整路径有帮助吗?
我想我在尝试查看属性时犯了一个错误。它位于_FuncPtr
属性内。我看不到它,但我可以打电话给它。谢谢@JosephSible-ReinstateMonica
【参考方案1】:
您需要的最少代码如下。导出函数不需要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']
【讨论】:
以上是关于使用python CDLL加载dll,但c代码中没有函数显示的主要内容,如果未能解决你的问题,请参考以下文章