首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >作为c++类的Python解释器

问作为c++类的Python解释器
EN

Stack Overflow用户
提问于 2009-09-26 05:28:19
回答 6查看 3.5K关注 0票数 9

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

我是否可以将Python解释器封装到一个c++类中,并从两个或更多个类实例中获取服务?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-01-13 18:28:55

我为不同线程中的不同解释器使用了Py_NewInterpreter,但这也应该适用于一个线程中的多个解释器:

在主线程中:

代码语言:javascript
复制
Py_Initialize();
PyEval_InitThreads();
mainThreadState = PyEval_SaveThread();

对于每个解释器实例(在任何线程中):

代码语言:javascript
复制
// 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!

最后,在主线程中完成:

代码语言:javascript
复制
PyEval_RestoreThread(mainThreadState);
Py_Finalize();

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

票数 14
EN

Stack Overflow用户

发布于 2009-09-26 10:01:10

调用Py_Initialize()两次不会很好地工作,但是Py_NewInterpreter可以工作,这取决于您尝试做什么。仔细阅读文档,调用此函数时必须按住GIL。

票数 6
EN

Stack Overflow用户

发布于 2009-09-26 06:28:09

您可以,但我建议您在有标准实现时不要重新实现Python解释器。使用Python::Python与进行交互。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1480490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档