使用不同的内置模块嵌入多个python 3解释器

时间:2017-03-10 09:09:49

标签: python c++ python-3.x embedding

我在C ++程序中成功嵌入了python 3.6解释器,但是我遇到了问题。

我想在同一个程序中嵌入两个解释器:

  • 可以使用我的C ++定义模块(MyModule
  • 可以使用此模块的人。

关于文档,我应该在PyImport_AppendInittab函数之前调用Py_Initialize,因此该模块将在整个程序中可用,但我想创建具有单独内置模块的单独解释器

致电Py_InitializePy_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;
}

0 个答案:

没有答案