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

How to embed Python in a multi platform C++ framework (JUCE)?

本文关键字:JUCE Python 框架 平台 C++      更新时间:2023-10-16

我正在使用JUCE设计音乐训练游戏,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

第二版:我敢肯定,在这里尝试引入完整的CPython源代码是过分的——一定有人在C/C++中实现了一些精简的Python,它不支持任何系统调用/多线程/花哨的东西——只是逐行地使用Python语法。浏览https://wiki.python.org/moin/PythonImplementations但我看不到明显的候选人。

第3版:https://github.com/micropython/micropython应该添加到最后一页,但它看起来仍然不是我在之后的样子

Python文档中有整整一章解释了将Python解释器嵌入另一个应用程序的不同方法。

嵌入Python与扩展Python类似,但并不完全相同。这个不同之处在于,当您扩展Python时应用程序仍然是Python解释器,而如果嵌入Python,主程序可能与Python无关——相反,应用程序的某些部分偶尔会调用Python解释器来运行一些Python代码。

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

有几种不同的方法可以调用解释器:包含到PyRun_SimpleString()的Python语句的字符串,或者可以传递stdio文件指针和文件名(用于在仅错误消息)发送到CCD_ 3。您也可以拨打前几章中描述的较低级别操作并使用Python对象。

可以在目录中找到嵌入Python的简单演示源发行版的Demo/embed/。

我最近决定创建一个将C++与Python混合的项目,从而使两全其美。我的想法是在Python中快速原型化类和函数,原因很明显,但仍然能够在Python中调用C++代码(原因也很明显)。因此,我建议您不要将Python嵌入到C++框架中,而是相反:将C++框架嵌入到Python项目中。为了做到这一点,您只需要编写非常简单的接口文件,并让Swig负责接口部分。

如果你想从头开始,有一个很好的工具叫cookiecutter,可以用来生成项目模板。您可以选择cookiecutter pypackage,或cookiecutter pylibrary。如本文所述,后者比前者有所改进。有趣的是,您还可以使用cookiecutter代码来生成C++项目的结构。这个空项目使用CMake构建系统,IMHO是开发独立于平台的C++代码的最佳框架。然后我必须决定这个混合项目的目录结构,所以我之前的一篇文章详细描述了这一点。祝你好运

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

检查SO:上的这些链接

将python扩展到swig,而不是swig或Cython

向Python 公开C++API

或者,您可以走艰难的道路,使用普通的Python/C API。