如何在多平台C++框架(JUCE)中嵌入Python
How to embed Python in a multi platform C++ framework (JUCE)?
我正在使用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。
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- Pybind11:将元组列表从Python传递到C++
- 如何在c++中使用引用实现类似python的行为
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 递归列出所有目录中的C++与Python与Ruby的性能
- IPC使用多个管道和分支进程来运行Python程序
- 从python中调用C++函数并获取返回值
- Python 3.7 和 excess_args 的 SWIG 问题
- Python中的for循环与C++有何不同
- 使用Pybind11向Python公开Eigen::张量
- Python str to C++ to Python str
- 如何使用Python从C++中读取谷物序列化数据
- 如何在C++中使用pybind11加载一个pickle python列表
- 如何在c++中使用system()来运行包含空格的python脚本
- python集合的C++等价物是什么.计数器
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 从python调用openMP共享库时,未定义opnMP函数
- 使用JsonCpp将数据返回到带有pybind11的python会在python调用中产生Symbol not foun
- 如何将真正的字符串从python c-api转换为python脚本
- 如何在多平台C++框架(JUCE)中嵌入Python