分配给通过 Python CTypes 从共享库导出的变量?
Posted
技术标签:
【中文标题】分配给通过 Python CTypes 从共享库导出的变量?【英文标题】:Assign to variable exported from shared library via Python CTypes? 【发布时间】:2019-08-12 05:24:24 【问题描述】:我有一个共享库 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那里学到了以上内容。)
但是,如果我尝试 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
确实指向value
的test.c
。您将希望写入c_int
的value
属性以写入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 例程的正确参数