我的工作中嵌入蟒c++.在一些特殊的情况下,我需要两个独立的实例,口译员在同一线。

我可以包蟒蛇的口译在c++类和获得服务的两个或多个类实例?

有帮助吗?

解决方案

我用Py_NewInterpreter在不同的线程不同的解释,但是这也应该好解释一个线程内工作:

在主线程:

Py_Initialize();
PyEval_InitThreads();
mainThreadState = PyEval_SaveThread();

有关每一解释实例(在任何线程中):

// initialize interpreter
PyEval_AcquireLock();                // get the GIL
myThreadState = Py_NewInterpreter();
... // call python code
PyEval_ReleaseThread(myThreadState); // swap out thread state + release the GIL

... // any other code

// continue with interpreter
PyEval_AcquireThread(myThreadState); // get GIL + swap in thread state
... // call python code
PyEval_ReleaseThread(myThreadState);

... // any other code

// finish with interpreter
PyEval_AcquireThread(myThreadState);
... // call python code
Py_EndInterpreter(myThreadState);
PyEval_ReleaseLock();                // release the GIL

请注意,你需要为每个翻译实例变量myThreadState!

最后,在主线程的处理:

PyEval_RestoreThread(mainThreadState);
Py_Finalize();

有可使用多个翻译实例一些限制(他们似乎不是完全独立的),但在大多数情况下,这似乎并没有引起问题。

其他提示

呼唤Py_Initialize()两次将不能很好地工作,但是 Py_NewInterpreter 可以工作,这取决于你想做什么。仔细阅读文档,你一定要挺住调用此当GIL。

您可以,但我建议你不要时,有一个标准实现重新实现一个Python解释器。使用升压::蟒以与Python接口。

我不认为你是想这样做的第一人,可惜我认为这是不可能的。您是否能够运行蟒蛇interperters为单独的进程,并使用RPC?

马赛克的回答并没有我的情况下我的模块是一个插件已经初始化蟒蛇主机应用程序。我能得到它与下面的代码工作。

// initialize interpreter
::PyEval_InitThreads();
::PyThreadState *mainThread = ::PyThreadState_Get();
myState = ::Py_NewInterpreter();
... // call python code
::PyThreadState_Swap(mainThread);

... // any other code

mainThread = ::PyThreadState_Swap(myState)
... // call python code
::PyThreadState_Swap(mainThread)

... // any other code

// finished with interpreter
mainThread = ::PyThreadState_Swap(myState)
::Py_EndInterpreter(myState);
::PyThreadState_Swap(mainThread)

当我称为PyEval_AcquireLock()阻断程序和功能没有返回。另外,主叫PyEval_ReleaseThread(myState)似乎也无效解释。

  • 你可以让蟒蛇口译员住在外面的应用的存储空间。只是嵌入解释在DLL。
  • 你可以设立和保存python情况下模拟两个不同的口译员。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top