我正在致力于将python嵌入到c++中。在一些特殊的情况下,我需要在同一线程中有两个不同的解释器实例。
我是否可以将Python解释器封装到一个c++类中,并从两个或更多个类实例中获取服务?
发布于 2012-01-13 18:28:55
我为不同线程中的不同解释器使用了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();使用多个解释器实例有一些限制(它们似乎不是完全独立的),但在大多数情况下,这似乎不会造成问题。
发布于 2009-09-26 10:01:10
调用Py_Initialize()两次不会很好地工作,但是Py_NewInterpreter可以工作,这取决于您尝试做什么。仔细阅读文档,调用此函数时必须按住GIL。
发布于 2009-09-26 06:28:09
您可以,但我建议您在有标准实现时不要重新实现Python解释器。使用Python::Python与进行交互。
https://stackoverflow.com/questions/1480490
复制相似问题