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

9

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

我知道这不是一个很好的设计,但我需要对现有代码进行小改动,我不想重新设计整个脚本。


我认为你所说的全局变量只是__main__模块的全局变量。实际上,每个导入的Python模块都有自己的全局变量。 内置函数globals - user5538922
4个回答

15

我不是Python大师,但我发现这个问题很有趣,所以我在网上搜了一下。 这篇文章 是“python嵌入API”的第一个搜索结果 - 它是否有所帮助?

如果属性属于模块的全局作用域,则可以使用 "PyImport_AddModule" 来获取模块对象的句柄。例如,如果你想要获取名为 "foobar" 的整数在 main 模块中的值,可以执行以下操作:

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

int foobar = PyInt_AsLong(v);

Py_DECREF(v);

这个链接已经失效了 - 有人有修复后的链接吗? - leecbaker
已解决 - 很奇怪他们会重新排列列表档案,但是在谷歌上搜索引用的文字很容易就找到了那条信息。 :-) - Sherm Pendley
又坏了。 - Shayne

6

0

我建议使用pyrex来创建一个扩展模块,你可以在Python中存储值,并且cdef一堆函数,这些函数可以从C中调用以返回那里的值。

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


0

你愿意稍微修改一下API吗?

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

    my_global = my_c_func(...)

  • 如果你正在使用Robin或Python C API,你可以将全局变量字典作为附加参数传递并进行修改。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接