【问题标题】:Is it possible to get the PyObject reference from the name of an existing variable? [duplicate]是否可以从现有变量的名称中获取 PyObject 引用? [复制]
【发布时间】:2017-03-06 11:34:36
【问题描述】:

有没有办法获取现有对象的对象引用, 在嵌入式 Python 代码中?

换句话说: 如果一个名为“obj”的对象已经存在(由脚本创建), 我需要将它“转换”为 PyObject* 引用,是否有类似的函数: PyObject *getObjectReference(char *name) ?

编辑: 例如, 假设我在代码的一部分中导入了一些模块,通过使用

PyRun_SimpleString("var = 1");

(或者也可以是定义相同变量的外部脚本)

现在,在代码的另一点中,我想获取该变量。我正在寻找类似的东西

PyObject *varPy = PyObject_GetGlobalObject("var");

"reading a global variable of python in c" 部分回答了我的问题,隐含地说,如果没有对创建它的模块的引用,就无法检索全局定义的变量。这是正确的吗?

【问题讨论】:

  • 您能否添加更多代码来显示您正在尝试做什么?
  • 响应您的编辑:如果您知道变量所在的模块的名称,您可以导入它以获取对模块的引用(导入已经导入的模块没有问题)。
  • 另外,如果你查看 PyRun_SimpleString 的文档,它会告诉你它运行的模块是 __main__
  • 感谢 DavidW 的建议。该变量不是由任何模块生成的,而是由主脚本生成的。我认为它可以从 main 中检索,但在另一个问题(“读取全局变量......”)中,这家伙说它对他不起作用(可能是因为它的变量已定义在脚本中?)。我会试试看的!
  • 像魅力一样工作!再次感谢。我将为我的问题写一个完整的答案以供进一步参考。

标签: python python-2.7 python-c-api pyobject


【解决方案1】:

通过reading a global variable of python in c 和我进行的一些测试,汇总从 DavidW(感谢您的帮助)收集的信息。

要获取对已加载模块的引用,请使用:

PyImport_AddModule("module_name");

为了获取对全局定义变量的引用,导入主模块并通过名称获取引用:

PyObject *mainModule = PyImport_AddModule("__main__");
PyObject *var = PyObject_GetAttrString(mainModule, "var_name");

如果变量是在不同的模块/脚本中定义的,那么它将仅在该模块中可见(而不是全局可见)。 因此,您必须将“ma​​in”更改为该特定模块的名称。

【讨论】:

    猜你喜欢
    • 2015-06-15
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 2011-04-27
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    相关资源
    最近更新 更多