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

Assign to variable exported from shared library via Python CTypes?

我有一个共享库 libtest.so 来自 test.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那里学到了以上内容。)

但是,如果我尝试写入相同的内容,那么它会抱怨:

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 对象没有直接 "point" 到 C 内存位置。

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

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

您的 c_int 指向 test.cvalue。您将要写入 c_intvalue 属性以写入 c_int 包装的底层内存。否则,您将只是在 Python-land 中将一个 Python 对象替换为另一个对象,而在 C land 中没有任何效果。例如:

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