分配给通过 Python CTypes 从共享库导出的变量?

Posted

技术标签:

【中文标题】分配给通过 Python CTypes 从共享库导出的变量?【英文标题】:Assign to variable exported from shared library via Python CTypes? 【发布时间】:2019-08-12 05:24:24 【问题描述】:

我有一个共享库 libtest.sotest.c 制成:

#include <stdio.h>
int value;
void fn()  printf("%d\n", value); 

现在我使用 CTypes 从 Python 包装这个库。我知道我可以从 Python 中读取value,如下所示:

In[2]: c_int.in_dll(lib, "value")
Out[2]: c_int(0)

(我从Mapping a global variable from a shared library with ctypes那里学到了以上内容。)

但是,如果我尝试 write 到相同的,那么它会抱怨:

In[3]: c_int.in_dll(lib, "value") = 2
  File "<ipython-input-4-5a1e8ea6a1b4>", line 1
    c_int.in_dll(lib, "value") = 2
                                  ^
SyntaxError: can't assign to function call

大概这是因为 c_int 对象没有直接“指向”C 内存位置。

当然,我可以编写和导出一个setValue 函数,该函数可以从Python 接收数据以在C 中修改value,但我想知道是否有任何方法可以做到没有那个。

Assigning Python function to ctypes pointer variable 似乎表明这是不可能的,但想要一个具体的答案,因此发布了具体的问题。

【问题讨论】:

【参考方案1】:

您的c_int 确实指向valuetest.c。您将希望写入c_intvalue 属性以写入c_int 包装的底层内存。否则,您将只是在 Python 领域用另一个 Python 对象替换一个 Python 对象,而在 C 领域没有任何影响。例如:

>>> import ctypes
>>> i = ctypes.c_int()
>>> i
c_int(0)
>>> i.value = 10
>>> i
c_int(10)

【讨论】:

以上是关于分配给通过 Python CTypes 从共享库导出的变量?的主要内容,如果未能解决你的问题,请参考以下文章

将 FILE * 从 Python / ctypes 传递给函数

通过 ctypes 从 Python 调用的 C 函数返回不正确的值

如何通过 ctypes 将(非空)列表从 Python 传递到 C++?

无法确定从 SWIG(不是 ctypes)C 传递给 python 例程的正确参数

将 C++ 中的“extern C”与 ctypes 的向量一起使用

将第三方共享库与 Python ctypes 集成