使用 ctypes 更改共享库中的值

Posted

技术标签:

【中文标题】使用 ctypes 更改共享库中的值【英文标题】:Change value in shared library with ctypes 【发布时间】:2015-11-06 23:00:51 【问题描述】:

我有以下lib.c

#include <stdio.h>

double var = 4;

double* fun() 
    printf("%zd %f\n", &var, var);
    return &var;

还有以下main.py

import ctypes
lib = ctypes.cdll.LoadLibrary('lib.so')
fun = lib.fun
fun.restype = ctypes.POINTER(ctypes.c_double)

print ctypes.addressof(fun().contents)

我怎样才能在.py里面,改变存储在fun().contents地址的double,例如,将var设置为10.2

【问题讨论】:

【参考方案1】:

以下将改变值:

import ctypes
lib = ctypes.cdll.LoadLibrary('x')
fun = lib.fun
fun.restype = ctypes.POINTER(ctypes.c_double)
v = fun()
v.contents.value = 2.0
v = fun()

输出(注意我使用%p而不是%zd的C函数):

000007FEFAC14000 4.000000
000007FEFAC14000 2.000000

【讨论】:

以上是关于使用 ctypes 更改共享库中的值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用特定于应用程序的值覆盖共享库中的 sass 变量

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

如何在 Git proto 存储库中发布对共享 .proto 文件的更改?

是否可以防止 C 共享库中的函数覆盖?

python C语言扩展之简单扩展-使用ctypes访问C代码

由两个应用程序共享时,库中的 Android 服务未更新