python - 如何使用标准库嵌入 Python3

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

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

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

我有两个选择:

  1. 尝试在没有标准库的情况下嵌入 Python3 (我已经问过 here )

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

(2) 需要什么?

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

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

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

最佳答案

因为这并没有真正的答案,所以我会为后代提供这个。我也无法访问 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 相关代码之前设置为指向它。

关于python - 如何使用标准库嵌入 Python3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34724879/

相关文章:

python - 在项目列表上调用一个函数的最干净的方法

inheritance - 在 Go 中嵌入而不是继承

android - Flutter包错误: This app is using a deprecated version of the Android embedding

python-3.x - 如何从 tfrecord 解码 vggish 音频集嵌入?

python - statsmodel.api.Logit : valueerror array must not contain infs or nans

python - 正则表达式捕获 html 元素及其类名

python - Python中两个函数的卷积

python-3.x - python : update instance variable of parent class in child class

python - 如何从类外部向类方法添加属性?

python - Pyplot 中 x 轴上的刻度频率较低