gpt4 book ai didi

python - 根据脚本将参数增加到 PyEval_EvalCode

转载 作者:太空宇宙 更新时间:2023-11-04 00:22:30 24 4
gpt4 key购买 nike

在下面的 MCVE 中,执行了两个不同的脚本。两者都没有做任何特别的事情,第一个有一个空函数,第二个脚本几乎什么都不做。但取决于脚本PyEval_EvalCode是否增加传递的全局/本地字典。文档什么也没说。但是根据脚本,执行后我有一个悬空的字典。我什么时候必须在之后或什么时候不使用它们?或者我在这里错过了什么?以下 C 代码片段输出传递的字典的引用计数。

我在 Windows 上用标准的 Python-2.7 解释器试过这个。

#pragma comment(lib, "C:\\Python27\\libs\\python27.lib")
#include "C:\\Python27\\include\\Python.h"

static int execute(const char* script)
{
PyObject* globals = PyDict_New();
PyDict_SetItemString(globals, "__builtins__", PyEval_GetBuiltins());

PyObject* code = Py_CompileString(script, "test", Py_file_input);
if (!code)
{
PyErr_Print();
return 0;
}

PyObject* result = PyEval_EvalCode((PyCodeObject*)code, globals, nullptr);
Py_DECREF(code);

if (!result)
{
PyErr_Print();
return 0;
}

Py_DECREF(result);
printf("Refcount of globals: %zd\n", globals->ob_refcnt);
Py_DECREF(globals); // missing decref spotted by user2357112

return 0;
}

int main()
{
const char* script = nullptr;

Py_Initialize();

// First script contains a function
script =
"def main():\n" \
" pass\n" \
"main()\n";
execute(script);

// second script does nothing
script = "12345";
execute(script);

Py_Finalize();
return 0;
}

最佳答案

额外的引用是函数自己对其全局变量字典的引用。此引用与您无关,您不需要减少该引用。

您只需执行递减以清算您拥有的引用。

关于python - 根据脚本将参数增加到 PyEval_EvalCode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48653091/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com