分配给通过 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.c
的 value
。您将要写入 c_int
的 value
属性以写入 c_int
包装的底层内存。否则,您将只是在 Python-land 中将一个 Python 对象替换为另一个对象,而在 C land 中没有任何效果。例如:
>>> import ctypes
>>> i = ctypes.c_int()
>>> i
c_int(0)
>>> i.value = 10
>>> i
c_int(10)
我有一个共享库 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.c
的 value
。您将要写入 c_int
的 value
属性以写入 c_int
包装的底层内存。否则,您将只是在 Python-land 中将一个 Python 对象替换为另一个对象,而在 C land 中没有任何效果。例如:
>>> import ctypes
>>> i = ctypes.c_int()
>>> i
c_int(0)
>>> i.value = 10
>>> i
c_int(10)