如何在多平台C ++框架(JUCE)中嵌入Python?

时间:2014-08-29 12:34:29

标签: python c++ embed embedding python-embedding

我正在使用JUCE设计音乐训练游戏 - 这是一个多平台C ++框架,允许我编写接近线路的音频/视频。

然而,我已经用Python编写了我的游戏玩法(控制流/数据处理) - 它很复杂,我希望不断更改它,以便我可以尝试不同的游戏。 Python非常适合这种快速原型制作工作。

所以我希望我(平台无关,所以Win / OSX / Lin / iOS / And)C ++启动一个Python运行时,将它提供一个.py文件,然后调用该.py中的各种函数。此外,我希望能够从.py。

回调C ++代码

以下是相关的官方Python文档:https://docs.python.org/2/extending/extending.html

以下是CodeProject文章:http://www.codeproject.com/Articles/11805/Embedding-Python-in-C-C-Part-I

然而,他们似乎都没有解决多平台问题。

该技术似乎是与库libpython.a和#include链接,它包含启动运行时环境,加载脚本,执行python代码等各种函数。

但是这个libpython.a肯定需要按平台单独编译吗?如果是这样,这将不是一个非常干净的解决方案,所以我可以将Python源代码添加到我的项目并让它编译.a?

我该怎么做呢?

编辑:https://wiki.python.org/moin/boost.python/EmbeddingPython

EDIT2:我很确定尝试引入完整的CPython源代码在这里有点过分 - 有人必须在C / C ++中制作一些不支持任何系统调用/多线程/幻想的Python实现-stuff - 只是通过Python语法逐行工作。通过https://wiki.python.org/moin/PythonImplementations看,但我看不到明显的候选人。

EDIT3:https://github.com/micropython/micropython应该添加到最后一页,但它看起来不像我在追求的那样

3 个答案:

答案 0 :(得分:3)

entire chapter of the Python docs解释了将Python解释器嵌入到另一个应用程序中的不同方法。

  

嵌入Python与扩展它类似,但并不完全。该   不同的是,当你扩展Python时,主程序了   应用程序仍然是Python解释器,而如果你嵌入   Python,主程序可能与Python无关 - 相反,   应用程序的某些部分偶尔会调用Python解释器   运行一些Python代码。

     

因此,如果您正在嵌入Python,那么您将提供自己的主要内容   程序。这个主程序必须做的一件事是初始化   Python解释器。至少,你必须打电话给   函数Py_Initialize()。有可选的传递命令调用   Python的行参数。然后你可以从中调用解释器   申请的任何部分。

     

调用解释器有几种不同的方法:你可以通过   包含到PyRun_SimpleString()的Python语句的字符串,或者您   可以传递stdio文件指针和文件名(用于标识)   仅错误消息)到PyRun_SimpleFile()。你也可以打电话给   前面章节中描述的低级操作构建   并使用Python对象。

     

可以在目录中找到嵌入Python的简单演示   演示/嵌入源代码分发。

答案 1 :(得分:0)

我最近决定创建一个将C ++与Python混合的项目,从而使成为两全其美的。我的想法是出于显而易见的原因在Python中对类和函数进行快速原型设计,但仍然能够在Python中调用C ++代码(出于显而易见的原因)。因此,我建议您不要在C ++框架中嵌入Python,而是将C ++框架嵌入到Python项目中。为此,您只需编写非常简单的接口文件,并让 Swig 处理接口部分。

如果你想从头开始,可以使用一个名为cookiecutter的漂亮工具来生成项目模板。您可以选择 cookiecutter -pypackage cookiecutter-pylibrary ,后者可以改进前as described here。有趣的是,您还可以使用cookiecutter代码生成C ++项目的结构。这个空项目使用 CMake 构建系统,IMHO是开发独立于平台的C ++代码的最佳框架。然后,我必须决定此混合项目的目录结构,因此one of my previous posts详细描述了这一点。祝你好运!

答案 2 :(得分:0)

我正在使用SWIG将Python嵌入到我的C ++应用程序中,并将其扩展,即在我的应用程序之外的Python中访问我的C ++ API。 SWIG和Python是多平台的,所以这不是一个真正的问题。 SWIG的一个主要优点是它可以为许多语言生成绑定。还有很多可以使用的C ++代码包装器,例如boost.python或cython。

在SO上查看这些链接:

Extending python - to swig, not to swig or Cython

Exposing a C++ API to Python

或者你可以采用简单的Python / C API。

相关问题