我用c++编写了一个使用嵌入式Python解释器的库(dll)。
当c++程序使用这个库时,在嵌入式解释器中执行Python脚本可以很好地工作。在
如果我从Python程序调用dll的函数,就会遇到麻烦。
当dll通常通过调用Py_Initialize()来启动嵌入式解释器时,已经有一个解释器在运行(我可以通过调用Py_IsInitialized()来测试这一点)。
当我试图使用这个解释器时,程序崩溃了。在
重现行为的最小示例:
dll代码:#include "stdafx.h"
#include
extern "C" __declspec(dllexport)
int testIsInitialized()
{
return Py_IsInitialized();
}
extern "C" __declspec(dllexport)
void testRunSimpleString()
{
PyRun_SimpleString("print('test')");
}
Python脚本:
^{pr2}$
输出:1
Traceback (most recent call last):
File "test_dll.py", line 9, in
dll.testRunSimpleString()
OSError: exception: access violation reading 0x0000000000000010
我的主要问题是:
如何从由不同Python程序导入的c++库中执行Python代码?在
更新
当我在testRunSImpleString()函数中获取全局解释器锁(GIL)时,这个例子起作用。
我不明白为什么这是必要的。在