7

是否可以在没有标准库的情况下嵌入 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;
}

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

ImportError: No module named site

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

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

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

这可能吗?还是我不可避免地会偶然发现缺少标准库中的 sys.path、import、{}、[] 或类似语言的基本块?

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

4

2 回答 2

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

于 2014-01-07T08:53:53.167 回答
1

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

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

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

于 2014-01-06T14:28:16.753 回答