如何重新初始化嵌入式Python解释器?

nab*_*nab 9 c++ python embed boost boost-python

我正在努力在我们的测试套件应用程序中嵌入Python.目的是使用Python运行多个测试脚本来收集数据并生成测试报告.一次测试运行的多个测试脚本可以创建可在下一个脚本中使用的全局变量和函数.

该应用程序还提供在嵌入式解释器中导入的扩展模块,用于与应用程序交换某些数据.

但是用户也可以进行多次测试运行.我不想在多次测试运行之间共享那些全局变量,导入和交换的数据.我必须确保我以真实状态重新启动以控制测试环境并获得相同的结果.

我该如何重新初始化翻译?

我使用了Py_Initialize()和Py_Finalize(),但在第二次运行时,我第二次将我提供给解释器的扩展模块初始化时获得异常.文档警告不要多次使用它.

使用子解释器似乎与扩展模块初始化具有相同的警告.

我怀疑我的扩展模块初始化时出了问题,但我担心第三方扩展模块会出现同样的问题.

也许可以通过在其自己的进程中启动解释器来使其工作,以确保释放所有内存.

顺便说一句,我正在使用boost-python,它也使用Py_Finalize警告AGAINST!

有什么建议吗?

谢谢

nab*_*nab 6

这是我发现实现我想要的效果的另一种方法,从解释器中的空白开始。

我可以控制用于执行代码的全局和本地命名空间:

// get the dictionary from the main module
// Get pointer to main module of python script
object main_module = import("__main__");
// Get dictionary of main module (contains all variables and stuff)
object main_namespace = main_module.attr("__dict__");

// define the dictionaries to use in the interpreter
dict global_namespace;
dict local_namespace;

// add the builtins
global_namespace["__builtins__"] = main_namespace["__builtins__"];
Run Code Online (Sandbox Code Playgroud)

然后,我可以使用命名空间来执行以下中包含的代码pyCode

exec( pyCode, global_namespace, lobaca_namespace );
Run Code Online (Sandbox Code Playgroud)

当我想运行测试的新实例时,我可以通过清理字典来清理命名空间:

// empty the interpreters namespaces
global_namespace.clear();
local_namespace.clear();        

// Copy builtins to new global namespace
global_namespace["__builtins__"] = main_namespace["__builtins__"];
Run Code Online (Sandbox Code Playgroud)

根据我想要执行的级别,我可以使用 global = local