如何从C访问Python全局变量?

时间:2008-11-12 21:32:09

标签: python c

我在Python脚本中有一些全局变量。该脚本中的一些函数调用C - 是否可以在C中设置其中一个变量,如果是,如何设置?

我很欣赏这首先不是一个非常好的设计,但我需要对现有代码进行一些小改动,我不想对现有脚本进行重大修改。

4 个答案:

答案 0 :(得分:14)

我不是蟒蛇大师,但我发现这个问题很有趣,所以我用Google搜索。 This是“python嵌入API”的第一个热门 - 它有帮助吗?

  

如果属性属于全局属性   一个模块的范围,然后你可以使用   获取句柄的“PyImport_AddModule”   到模块对象。例如,如果   你想获得一个的价值   名为 main 模块中的整数   “foobar”,你会做以下事情:

PyObject *m = PyImport_AddModule("__main__");
PyObject *v = PyObject_GetAttrString(m,"foobar");

int foobar = PyInt_AsLong(v);

Py_DECREF(v);

答案 1 :(得分:6)

对于来自谷歌的任何人来说,这是直接的方法:

PyObject* PyEval_GetGlobals()

https://docs.python.org/2/c-api/reflection.html

https://docs.python.org/3/c-api/reflection.html

返回值作为字典进行访问。

答案 2 :(得分:0)

我建议使用pyrex创建一个扩展模块,你可以将值存储在python中,然后cdef一系列函数,可以从C调用它们来返回值。

否则,很大程度上取决于您尝试传输的值的类型。

答案 3 :(得分:0)

您是否愿意稍微修改一下

  • 您可以让C函数返回全局的新值,然后像这样调用它:

    my_global = my_c_func(...)

  • 如果您直接使用Robin或Python C API,可以将全局字典作为附加参数传递并修改

  • 如果你的全局总是在同一个模块中,那么Sherm的解决方案看起来很棒