繁体   English   中英

Python解释器作为c ++类

[英]Python interpreter as a c++ class

我正在努力将python嵌入到c ++中。 在某些特殊情况下,我需要在同一个线程中有两个独立的解释器实例。

我可以将Python解释器包装到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();

使用几个解释器实例有一些限制(它们似乎不完全独立),但在大多数情况下,这似乎不会导致问题。

Callin Py_Initialize()两次不能正常工作,但Py_NewInterpreter可以工作,具体取决于你想要做什么。 仔细阅读文档,调用它时必须持有GIL。

您可以,但我建议您在有标准实现时不要重新实现Python解释器。 使用boost :: python与Python接口。

我不认为你是第一个想要这样做的人,不幸的是我认为这是不可能的。 您是否能够将python中间件作为单独的进程运行并使用RPC?

mosaik的答案在我的情况下不起作用,我的模块是已经初始化python的宿主应用程序的插件。 我能够使用以下代码。

// 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)似乎也使解释器无效。

  • 您可以让python解释器位于应用程序内存空间之外。 只需将解释器嵌入DLL中即可。
  • 您可以设置和保存python上下文来模拟两个不同的解释器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM