将Python解释器作为C++类

9 投票
6 回答
3898 浏览
提问于 2025-04-15 14:36

我正在把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();

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

撰写回答