将Python解释器作为C++类
我正在把Python嵌入到C++中。在某些特殊情况下,我需要在同一个线程里有两个独立的Python解释器实例。
我可以把Python解释器封装成一个C++类,然后从两个或更多的类实例中获取服务吗?
6 个回答
4
你可以这样做,但我建议你不要自己重新实现一个Python解释器,因为已经有标准的实现了。可以使用boost::python来和Python进行交互。
6
调用 Py_Initialize()
两次是行不通的,不过 Py_NewInterpreter
可能会有效,这要看你想做什么。仔细阅读文档,你在调用这个的时候需要保持 GIL。
14
我在不同的线程中使用了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();
使用多个解释器实例时有一些限制(它们似乎并不是完全独立的),但在大多数情况下,这似乎不会造成问题。