【问题标题】:How to embed Python3 with the standard library如何在标准库中嵌入 Python3
【发布时间】:2016-04-15 23:01:31
【问题描述】:

我正在尝试将 Python 嵌入到(最终是多平台的)C++ 应用程序中。

重要的是我的应用程序包含自己的 Python 实现(与 blender 的方式相同),因此它是完全独立的。 (否则会成为配置雷区)。

我有两个选择:

  1. 尝试嵌入 Python3 没有标准库(我已经问过here

  2. 尝试将 Python3 嵌入标准库。

(2) 需要什么?

有了这些信息,我将能够平衡每种方法的优点与设置它所需的工作量。

我的嵌入式 Python 将供我自己使用(而不是任何用户级脚本)——主要是控制流/游戏逻辑。我只需要很少的标准库——也许我可以在必要时通过隧道回到 C++ 将其减少到 0——例如,如果我需要一个随机数,我可以创建一个 C++ 例程并从 Python 访问它。我已经涵盖了所有这些。

然而,它开始看起来好像即使是最小安装也必须包含一些 stdlib 组件,这提示了一个问题:“如果我必须包括一些,也许最好包括所有!”

【问题讨论】:

  • 不是stackoverflow.com/q/34724057/3005167 的重复。 (只是提到这一点是为了防止意外标记,就像它几乎发生在我身上一样:))
  • 嗯,怎么回事?是否有什么东西不起作用,或者您正在寻找一个宽泛的答案?

标签: python python-3.x embedding standard-library


【解决方案1】:

您正在寻找Boost.Python

它是一个 C++ 库,它可以在 C++ 和 Python 编程语言之间实现无缝互操作性,我认为这应该可以满足您的需求,除非您正在尝试实现其他目标.

它还有一种将 python 解释器嵌入到 C++ 代码中的机制,可以参考this link(URL 不是特定于版本)来深入研究可能性。

附:我不太相信重新发明轮子,而更相信可重用性。

【讨论】:

  • 这个答案很模糊。您应该为 OP 尝试处理的任务提供某种(进一步的)解释或具体实现。
  • 此外,如果附有高质量的解释,微妙的个人观点或意见会很受欢迎,但如果它们实际上替代了所有内容,则不会。
【解决方案2】:

我想你已经仔细检查了如何在另一个应用程序中嵌入 Python(here 你会看到一些涵盖嵌入 python2 但在我看来也适用于 python3 的内容)

有不同类型的嵌入:

  • 非常高级的嵌入
  • 超越非常高级别的嵌入
  • 纯嵌入
  • 在 C++ 中嵌入 Python

由于您的问题与“在 C++ 中嵌入 Python”有关,您可以阅读以下内容:

也可以将 Python 嵌入到 C++ 程序中; 具体如何 这将取决于所使用的 C++ 系统的细节;在 一般来说,你需要用 C++ 编写主程序,并使用 C++ 编译器来编译和链接你的程序。没有必要 使用 C++ 重新编译 Python 本身。

一方面你说“(最终是多平台)C++ 应用程序”,另一方面你有“具体如何完成将取决于所使用的 C++ 系统的细节",那么您能解释一下所使用的C++系统的更多细节吗?

您还可以找到一些提示 here 与使用 pybind11 module 或另一个 old page 有关如何在 C/C++ 中嵌入 Python 和导入模块(python2.6 但我希望您能找到灵感与)

总结:

您显然需要 Python 的开发包才能拥有 Python 包含目录

【讨论】:

    【解决方案3】:

    由于这并没有真正的答案,我将把它提供给后代。我也无法使用 Mac,所以它对你来说可能与在 Linux 上有所不同。此外,必须安装所需的依赖项才能使其正常工作,但这通常很容易弄清楚。

    创建工作目录

    mkdir ~/embeddedpython
    cd ~/embeddedpython
    

    下载 Python 源代码

    wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz
    

    为 Python 创建安装目录

    mkdir ./installation
    

    解压下载的源文件

    tar xvf Python-3.6.1.tgz
    

    进入新建的源码目录

    cd Python-3.6.1
    

    配置Python安装到我们的安装目录

    ./configure --prefix="/home/<username>/embeddedpython/installation"
    

    制作和安装 Python

    make && make install
    

    回到你的工作目录

    cd ..
    

    创建一个新的PYTHONHOME 库所在的目录

    mkdir home && mkdir home/lib
    

    将 Python 库复制到我们的新主目录

    cp -r ./installation/lib/python3.6 ./home/lib/
    

    使用取自 python documentation 的以下代码创建一个新的 c++ 源文件 (embeddedpython.cpp),setenv 函数调用除外。

    #include <Python.h>
    #include <cstdlib>
    
    int main(int argc, char *argv[])
    {
        setenv("PYTHONHOME", "./home", 1);
    
        wchar_t *program = Py_DecodeLocale(argv[0], NULL);
        if (program == NULL) {
            fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
            exit(1);
        }
        Py_SetProgramName(program);  /* optional but recommended */
        Py_Initialize();
        PyRun_SimpleString("from time import time,ctime\n"
                           "print('Today is', ctime(time()))\n");
        if (Py_FinalizeEx() < 0) {
            exit(120);
        }
        PyMem_RawFree(program);
        return 0;
    }
    

    编译运行

    g++ embeddedpython.cpp -I ./installation/include/python3.6m/ ./installation/lib/libpython3.6m.a  -lpthread -ldl -lutil
    ./a.out
    
    > Today is Fri Apr 14 16:06:54 2017
    

    从这里开始,它像往常一样是标准的嵌入式 python。使用这种方法,必须将“home”目录包含在您的部署中,并且必须将环境变量PYTHONHOME 设置为指向它,然后才能执行任何与python 相关的代码。

    【讨论】:

      猜你喜欢
      • 2016-04-15
      • 2017-12-14
      • 1970-01-01
      • 1970-01-01
      • 2020-12-11
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多