1

我正在使用 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-CC-Part-I

但是,它们似乎都没有解决多平台问题。

该技术似乎是与库 libpython.a 和#include 链接,其中包含用于启动运行时环境、加载脚本、执行 python 代码等的各种功能。

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

我该怎么做呢?

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

EDIT2:我很确定在这里尝试引入完整的 CPython 源代码是矫枉过正——一定有人在不支持任何系统调用/多线程/花哨的东西的 C/C++ 中做了一些精简的 Python 实现—— - 仅通过 Python 语法逐行工作。通过https://wiki.python.org/moin/PythonImplementations查看,但我看不到明显的候选人。

EDIT3:https://github.com/micropython/micropython应该添加到最后一页,但它看起来仍然不是我所追求的

4

3 回答 3

3

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

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

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

调用解释器有几种不同的方法:您可以将包含 Python 语句的字符串传递给PyRun_SimpleString(),或者您可以将 stdio 文件指针和文件名(仅用于在错误消息中标识)传递给PyRun_SimpleFile(). 您还可以调用前面章节中描述的较低级别的操作来构造和使用 Python 对象。

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

于 2014-08-29T13:54:09.150 回答
0

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

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

于 2014-09-08T21:37:24.037 回答
0

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

检查这些链接:

扩展 python - swig,而不是 swig 或 Cython

向 Python 公开 C++ API

或者你也可以硬着头皮使用普通的 Python/C API。

于 2014-09-10T20:06:59.407 回答