使用不同的内置模块嵌入多个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函数会导致巨大的内存泄漏,所以我认为这不是一个好
- 可不可使用此模块的用户
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
。