使用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代码中没有函数显示的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中从 C DLL 加载和使用结构和函数?

python引用c的dll

无法在 python 中加载 c++ DLL

如何在 Python 中从 SXS 加载 C DLL?

python使用ctypes调用dll

python使用ctypes调用dll