如何使用Python ctypes直接更新C全局函数指针变量?

如何使用Python ctypes直接更新C全局函数指针变量?,python,c,global-variables,function-pointers,ctypes,Python,C,Global Variables,Function Pointers,Ctypes,考虑这个test.c: #包括 const char*x=“一”; 无效集(常量字符*新字符){ x=新的x; } 作废打印x(作废){ printf(“x是%s\n”,x); } 先作废(作废){ 放置(“在第一个函数中”); } void(*f)(void)=第一个f; 无效集合(无效(*新的)(无效)){ f=新的f; } void do_f(void){ f(); } 这个test.py: #/usr/bin/env蟒蛇3 导入ctypes def second_f(): 打印('在第

考虑这个
test.c

#包括
const char*x=“一”;
无效集(常量字符*新字符){
x=新的x;
}
作废打印x(作废){
printf(“x是%s\n”,x);
}
先作废(作废){
放置(“在第一个函数中”);
}
void(*f)(void)=第一个f;
无效集合(无效(*新的)(无效)){
f=新的f;
}
void do_f(void){
f();
}
这个
test.py

#/usr/bin/env蟒蛇3
导入ctypes
def second_f():
打印('在第二个函数中')
def third_f():
打印('在第三个函数中')
test_so=ctypes.CDLL('./test.so')
x_type=ctypes.c_char\p
f_type=ctypes.CFUNCTYPE(无)
test_so.set_x.restype=None
test_so.set_x.argtypes=(x_type,)
test_so.print_x.restype=None
test_so.print_x.argtypes=()
test_so.set_f.restype=None
test_so.set_f.argtypes=(f_type,)
test_so.do_f.restype=None
test_so.do_f.argtypes=()
test_so.print_x()
x=x_type.in_dll(测试'x')
x、 值=b'two'
test_so.print_x()
新的x=x型(b'three')
测试设置(新)
test_so.print_x()
测试so.do_f()
f=f_type.in_dll(测试'f')
f、 值=秒
测试so.do_f()
新的f=f型(第三个f型)
测试设置(新)
测试so.do_f()
当我运行
gcc-g-fPIC-shared test.c-o test.so&./test.py
时,我得到以下输出:

x是一个
x是2
x是三
在第一个函数中
在第一个函数中
第三种功能

我希望/期望在第二个函数中获得
,而不是在第一个函数
中第二次出现
。当我用我对
x
做的所有事情都一样时,为什么在_dll
中使用
直接设置全局变量
f
不起作用?显然,Python知道如何将自己的函数转换为C函数指针,因为当我使用
third\f
调用setter时,它工作得很好。但是,如果没有setter,如何使其工作,如
x
工作?

与通过获取
x
返回的对象不同,以下内容不支持
.value
属性,因此没有任何效果:

f = f_type.in_dll(test_so, 'f')
f.value = second_f 

设置函数全局似乎不受
ctypes

CFUNCTYPE
支持创建函数类型,而不是函数指针类型。如果创建函数指针类型并通过正确的类型访问
f
,会发生什么情况?(此外,您需要保留对通过
f\u type
创建的对象的引用,因为ctypes无法为您执行此操作。您通过在生命周期结束后尝试使用回调来调用未定义的行为。)@user2357112supportsMonica您的意思是,如果不是
f_type=ctypes.CFUNCTYPE(None)
,而是
f_type=ctypes.POINTER(ctypes.CFUNCTYPE(None))
?然后,倒数第二行不变,但最后一行被替换为test_so.set_f(f_type(third_f))TypeError中的
Traceback(最近一次调用last):File“/test.py”,第33行。错误:预期的是CFunctionType而不是function
。我更新了代码以保留引用。@user2357112supportsMonica
指针(CFUNCTYPE(None)
也不起作用。
CFUNCTYPE(NONE)
实例“衰减”到指向函数的指针,因此它更像是指向函数的双指针。我在中对此进行了讨论(这个问题可能被标记为该问题的重复)而且它也不起作用。
ctypes
似乎不直接支持全局函数指针,必须使用辅助函数。