C.dll 如何向 Python 公开变量?

Posted

技术标签:

【中文标题】C.dll 如何向 Python 公开变量?【英文标题】:How can C.dll expose variable to Python? 【发布时间】:2017-05-26 01:22:42 【问题描述】:

我正在尝试将 C 主程序写入 dll,Python 将从该 dll 导入所有内容(包括所有变量和函数),并运行 dll 中定义的函数。但是,我打算不仅将函数导出,还将变量从 DLL 导出到 Python。 我了解如何使用 DLL 向 Python 公开函数,但我不确定如何在 Python 中使用 Ctype 从 dll 访问变量。

我们举个例子: 如果在标题内,我们有#DEFINE MAXDEVNUMBER 4。 当我使用 ctype print mydll.MAXDENUMBER 它给我一个错误。未找到函数“MAXDENUM”

【问题讨论】:

【参考方案1】:

您无法访问预处理器宏,因为它们不是从 DLL 导出的。您只能访问导出的 C 函数和全局变量。

例如,test.c

__declspec(dllexport) int b = 5;

__declspec(dllexport) int func(int a)

    return a + b;

>>> from ctypes import *
>>> dll = CDLL('test')
>>> dll.func(1)
6
>>> x=c_int.in_dll(dll,'b')  # access the global variable
>>> x.value
5
>>> x.value = 6              # change it
>>> dll.func(1)
7

【讨论】:

暴露一个数组怎么样?到 Python? 使用正确的类型。例如:x = (c_int * 10).in_dll(dll,'b') 访问int b[10] 谢谢先生。你是英雄。现在一切正常! Tolnen 二维数组呢? (c_int * 10 * 5)int b[5][10]。注意索引是相反的。

以上是关于C.dll 如何向 Python 公开变量?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ DLL 和 C# 类之间来回传递变量

如何使用 boost/python 向 python 公开 C++ 虚函数?

如何使用 Cython 向 Python 公开返回 C++ 对象的函数?

如何使用 Typescript Vue 组件向外部公开数据?

C DLL 和 Python CTypes - 发布/调试中的不同返回

从 Objective-C 向 Swift 公开一个常量变量