我正在尝试将 Python 嵌入到(最终是多平台的)C++ 应用程序中。
重要的是,我的应用程序包含自己的 Python 实现(与 blender 的实现方式相同),以便它完全独立。 (否则成为配置雷区)。
我有两个选择:
尝试在没有标准库的情况下嵌入 Python3 (我已经问过 here )
尝试用标准库嵌入 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/