Dou*_*oug 7 python python-embedding
是否可以在没有标准库的情况下嵌入python?
我正在使用python 2.7.6的cmake构建,我已经运行了一个基本的嵌入式脚本,如下所示:
#include <stdio.h>
#include <Python.h>
int main(int argc, char *argv[]) {
/* Setup */
Py_SetProgramName(argv[0]);
Py_Initialize();
/* Run the 'main' module */
int rtn = Py_Main(argc, _argv);
Py_Finalize();
return rtn;
}
Run Code Online (Sandbox Code Playgroud)
..但是当我运行它时,我得到:
ImportError: No module named site
Run Code Online (Sandbox Code Playgroud)
如果我设置了正确的$ PYTHONHOME,它可以正常工作; 但这不是我想要做的.我试图在没有标准库的独立应用程序中嵌入python的副本.
我很欣赏它的使用,但对于这个特定的嵌入式环境,我想要更像lua的东西(但显然有python语法),其中只有父应用程序公开的特定库可用.
这还有一个额外的好处,即不关心分发(或构建)标准库及其所有交叉链接的动态库.
这有可能吗?或者我不可避免地会发现缺少语言的基本块,如sys.path,import,{},[]或类似标准库的一部分?
如果有可能,你会怎么做呢?
Dou*_*oug 11
简单的答案是肯定的.
int main(int argc, char *argv[]) {
/* Setup */
Py_NoSiteFlag = 1; // <--- This
Py_SetProgramName(argv[0]);
Py_Initialize();
/* Run the 'main' module */
int rtn = Py_Main(argc, argv);
Py_Finalize();
return rtn;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,没有什么打破,你可以继续使用一切(包括导入模块的能力〜)完全没问题.如果您尝试从未捆绑的标准库中导入任何内容,您将获得:
>>> import os;
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named os
Run Code Online (Sandbox Code Playgroud)
我会在这里为所有感兴趣的人留下一份代码副本;
https://github.com/shadowmint/cmake-python-embed-nostdlib