是否可以在没有标准库的情况下嵌入python?

时间:2014-01-06 14:02:54

标签: python python-embedding

是否可以在没有标准库的情况下嵌入python?

我正在使用cmake build for python 2.7.6并且我已经运行了一个基本的嵌入式脚本,如下所示:

#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;
}

..但是当我运行它时,我得到了:

ImportError: No module named site

如果我设置了正确的$ PYTHONHOME,它可以正常工作;但这不是我想要做的。我试图在没有标准库的独立应用程序中嵌入python的副本。

我很欣赏它的使用,但对于这个特定的嵌入式环境,我想要更像lua的东西(但显然有python语法),其中只有父应用程序公开的特定库可用。

这还有一个额外的好处,即不关心分发(或构建)标准库及其所有交叉链接的动态库。

这有可能吗?或者我不可避免地会发现缺少语言的基本块,如sys.path,import,{},[]或类似标准库的一部分?

如果有可能,你会怎么做呢?

2 个答案:

答案 0 :(得分: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;
}

据我所知,没有什么破坏,你可以继续使用一切(包括导入模块的能力〜)完全没问题。如果您尝试从未捆绑的标准库中导入任何内容,您将获得:

>>> import os;
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named os

我会在这里留下任何感兴趣的人的代码副本;

https://github.com/shadowmint/cmake-python-embed-nostdlib

答案 1 :(得分:1)

AFAIK,你做不到。没有标准库,Python甚至不会启动,因为它试图找到os.py(在3.x中; 2.x中的string.py)。在启动时,它会导入许多模块,特别是site.py.您至少需要pythonxy.dll,可能还有lib文件夹的内容,以及扩展模块,即DLLs文件夹的内容。

您可以使用文件pythonXX.zip(其中XX是版本号,如27或33)运送它,它应该是标准库的压缩副本。你可以自由地从你不需要的东西中剥离图书馆;有各种工具可以静态地计算依赖关系(参见modulefinder)。

我想这就是Lua作为嵌入式脚本语言更受欢迎的原因。