pythonc扩展:PyEval_GetLocals()返回NULL

pythonc扩展:PyEval_GetLocals()返回NULL,python,c++,c,python-c-extension,python-extensions,Python,C++,C,Python C Extension,Python Extensions,我需要在C/C++中从Python中读取局部变量。当我尝试PyEval\u GetLocals时,我得到一个空值。尽管Python已初始化,但仍会发生这种情况。下面是一个简单的例子 #include <iostream> #include <Python.h> Py_Initialize(); PyRun_SimpleString("a=5"); PyObject *locals = PyEval_GetLocals(); std::cout<<locals

我需要在C/C++中从Python中读取局部变量。当我尝试
PyEval\u GetLocals
时,我得到一个空值。尽管Python已初始化,但仍会发生这种情况。下面是一个简单的例子

#include <iostream>
#include <Python.h>

Py_Initialize();
PyRun_SimpleString("a=5");
PyObject *locals = PyEval_GetLocals();
std::cout<<locals<<std::endl; //prints NULL (prints 0)
Py_Finalize();
#包括
#包括
Py_初始化();
简单限制(“a=5”);
PyObject*locals=PyEval_GetLocals();

std::cout证明了访问范围中变量的正确方法是:

Py_Initialize();
PyObject *main = PyImport_AddModule("__main__");
PyObject *globals = PyModule_GetDict(main);
PyObject *a = PyDict_GetItemString(globals, "a");
std::cout<<globals<<std::endl; //Not NULL
Py_Finalize();
Py_Initialize();
PyObject*main=PyImport\u AddModule(“\uuuu main\uuuu”);
PyObject*globals=PyModule_GetDict(main);
PyObject*a=PyDict_GetItemString(全局,“a”);

std::cout证明了访问范围中变量的正确方法是:

Py_Initialize();
PyObject *main = PyImport_AddModule("__main__");
PyObject *globals = PyModule_GetDict(main);
PyObject *a = PyDict_GetItemString(globals, "a");
std::cout<<globals<<std::endl; //Not NULL
Py_Finalize();
Py_Initialize();
PyObject*main=PyImport\u AddModule(“\uuuu main\uuuu”);
PyObject*globals=PyModule_GetDict(main);
PyObject*a=PyDict_GetItemString(全局,“a”);


标准::cout@martineau但即使是globals也返回NULL!这是否意味着这不是获取变量的合适方法?因为我已经接受了这个答案@martineau验证
PyRun\u SimpleString()
是否正常工作非常容易。我可以打印资料和分配资料,而且效果很好。您是否建议对该示例代码进行修复?@martineau,它也返回NULL。我在第一次回复您时提到:-)@martineau Printing
a
使用您提供的命令进行工作并打印
5
。同时使用
print(locals())
打印
locals()
打印包含
a
@martineau的
dict
:(…@martineau,但即使globals也返回NULL!这是否意味着这不是获取变量的适当方法?因为我已经接受了关于这一点的答案。@martineau验证
PyRun_SimpleString()
工作起来很简单。我可以打印东西和分配东西,它可以工作。你能建议对该示例代码进行修复吗?@martineau也会返回NULL。我在第一次回复你时提到:-)@martineau Printing
a
使用你提供的命令工作并打印
5
。还打印
locals()
with
print(locals())
打印一个
dict
,其中包含
a
@martineau:(…旁注:这泄漏了一个引用;程序将在退出时清理,但如果您需要调试引用泄漏,这将是另一个需要涉过的泄漏。最简单的修复方法是更改
PyDict\u GetItem(globals,PyUnicode\u FromString)(“a”);
PyDict_GetItemString(globals,“a”);
在逻辑上是相同的,只是它管理着为您创建和发布
PyUnicode
对象,确保它正确地
DECREF
-ed。@ShadowRanger非常感谢您!这是一个重要的提示,我相应地更新了我的代码:)我希望这里没有更多的漏洞。请更新您的答案,使其与您的问题基本相同。此外,
PyModule_GetDict(main)
似乎会导致编译错误,因为
main
未定义。@martineau是否确定
main
未定义?@martineau答案中的代码将替换问题中的代码。目的是从Python框架中提取一个变量。旁注:这会泄漏一个引用;程序将在退出时清除,但如果您需要调试引用泄漏,这将是又一个需要涉过的泄漏。最简单的修复方法是将
PyDict_GetItem(globals,PyUnicode_FromString(“a”);
更改为
PyDict_GetItemString(globals,“a”);
这在逻辑上是相同的,只是它管理着为您创建和发布
PyUnicode
对象,确保它正确地
DECREF
-ed.@ShadowRanger非常感谢您!这是一个重要的提示,我相应地更新了我的代码:)我希望这里没有更多的漏洞。请更新您的答案,使其与您的问题基本相同。此外,
PyModule_GetDict(main)
似乎会导致编译错误,因为
main
未定义。@martineau您确定
main
未定义吗?@martineau答案中的代码替换问题中的代码。目的是从Python框架中提取变量。