使用不同的内置模块嵌入多个python 3解释器 我在C++程序中成功地嵌入了Python 3.6解释器,但我遇到了一个问题。

使用不同的内置模块嵌入多个python 3解释器 我在C++程序中成功地嵌入了Python 3.6解释器,但我遇到了一个问题。,python,c++,python-3.x,embedding,Python,C++,Python 3.x,Embedding,我想在同一个程序中嵌入两个口译员: 一个可以使用我的C++定义模块( MyModule > 可不可使用此模块的用户 关于文档,我应该在Py\u Initialize函数之前调用PyImport\u AppendInittab,这样模块将在整个程序中可用,但我想使用单独的内置模块创建单独的解释器 调用Py\u Initialize和Py\u Finalize没有帮助,第二个解释器中也将提供该模块。顺便说一句,多次调用init和finalize函数会导致巨大的内存泄漏,所以我认为这不是一个好

我想在同一个程序中嵌入两个口译员:

    一个可以使用我的C++定义模块(<代码> MyModule <代码> >
  • 不可使用此模块的用户
关于文档,我应该在
Py\u Initialize
函数之前调用
PyImport\u AppendInittab
,这样模块将在整个程序中可用,但我想使用单独的内置模块创建单独的解释器

调用
Py\u Initialize
Py\u Finalize
没有帮助,第二个解释器中也将提供该模块。顺便说一句,多次调用init和finalize函数会导致巨大的内存泄漏,所以我认为这不是一个好的解决方案,即使它可以工作

你知道如何解决这个问题吗

完整代码:

#include <iostream>

#pragma push_macro("_DEBUG")
#undef _DEBUG
#include "Python.h"
#pragma pop_macro("_DEBUG")

static PyObject* Addition (PyObject *self, PyObject *args)
{
    double a = 0.0;
    double b = 0.0;
    if (!PyArg_ParseTuple (args, "dd", &a, &b)) {
        return nullptr;
    }
    double result = a + b;
    return PyFloat_FromDouble (result);
}

static PyMethodDef ModuleMethods[] =
{
    {"Add", Addition, METH_VARARGS, "Adds numbers."},
    {nullptr, nullptr, 0, nullptr}
};

static PyModuleDef ModuleDef = {
    PyModuleDef_HEAD_INIT,
    "MyModule",
    NULL,
    -1,
    ModuleMethods,
    NULL,
    NULL,
    NULL,
    NULL
};

static PyObject* ModuleInitializer (void)
{
    return PyModule_Create (&ModuleDef);
}

int main ()
{
    Py_SetPythonHome (L".");
    Py_SetPath (L"python36.zip\\Lib");

    { // first interpreter
        PyImport_AppendInittab ("MyModule", ModuleInitializer);
        Py_Initialize ();
        PyRun_SimpleString (
            "import MyModule\n"
            "print (MyModule.Add (1, 2))"
        );
        Py_Finalize ();
    }

    { // second interpreter without AppendInittab (should not find MyModule, but it does)
        Py_Initialize ();
        PyRun_SimpleString (
            "import MyModule\n"
            "print (MyModule.Add (1, 2))"
        );
        Py_Finalize ();
    }

    system ("pause");
    return 0;
}
#包括
#pragma push_宏(“调试”)
#未定义调试
#包括“Python.h”
#pragma pop_宏(“调试”)
静态PyObject*添加(PyObject*自身,PyObject*参数)
{
双a=0.0;
双b=0.0;
if(!PyArg_parsetup(args,dd,&a,&b)){
返回空ptr;
}
双结果=a+b;
从double返回PyFloat_(结果);
}
静态PyMethodDef模块方法[]=
{
{“Add”,Addition,METH_VARARGS,“Adds number.”,
{nullptr,nullptr,0,nullptr}
};
静态PyModuleDef ModuleDef={
PyModuleDef_HEAD_INIT,
“MyModule”,
无效的
-1,
模块方法,
无效的
无效的
无效的
无效的
};
静态PyObject*模块初始化器(void)
{
返回PyModule\u创建(&ModuleDef);
}
int main()
{
Py_SetPythonHome(L“);
Py_SetPath(L“python36.zip\\Lib”);
{//第一口译员
PyImport_AppendInittab(“MyModule”,ModuleInitializer);
Py_初始化();
皮伦·欧·斯普勒斯特林(
“导入MyModule\n”
“打印(MyModule.Add(1,2))”
);
Py_();
}
{//没有AppendInittab的第二个解释器(不应该找到MyModule,但它找到了)
Py_初始化();
皮伦·欧·斯普勒斯特林(
“导入MyModule\n”
“打印(MyModule.Add(1,2))”
);
Py_();
}
系统(“暂停”);
返回0;
}

你看了吗?是的,我试过了,但是没有用,因为
PyImport\u AppendInittab
应该在
Py\u Initialize
之前调用,并且
Py\u Initialize
创建模块,所以所有子口译员都会看到它。问题是不能为子解释器定义模块。顺便说一句,如果嵌入python 2.7,它就可以工作,因为
Py_InitModule
调用适用于子解释器。但是Python3.6中不存在
Py_InitModule