运行 Python 3.5 解释器需要哪些标准库模块?

Posted

技术标签:

【中文标题】运行 Python 3.5 解释器需要哪些标准库模块?【英文标题】:Which standard library modules are required to run the Python 3.5 interpreter? 【发布时间】:2017-03-30 18:26:34 【问题描述】:

这是一个 CPython 程序,它尝试使用空的 sys.path 初始化解释器:

#include <Python.h>

int main(int argc, char** argv)

    wchar_t* program = NULL;
    wchar_t* sys_path = NULL;

    Py_NoSiteFlag = 1;

    program = Py_DecodeLocale(argv[0], NULL);
    Py_SetProgramName(program);

    sys_path = Py_DecodeLocale("", NULL);
    Py_SetPath(sys_path);

    Py_Initialize();

    PyMem_RawFree(program);    
    PyMem_RawFree(sys_path);
    Py_Finalize();

执行上面的程序会引发以下错误:

Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'

Current thread 0x00007ffff7fc6700 (most recent call first):
Signal: SIGABRT (Aborted)

那么 Python 3.5 标准库中的哪些包和模块,除了 encodings 包之外,是绝对需要运行 Python 3.5 解释器的?在我看来,文档中没有此信息。

【问题讨论】:

您可以通过运行解释器进行测试,然后查看导入模块的字典以查看其中包含的内容。 【参考方案1】:

这些是解释器启动期间使用的包/模块(正如@Charles Duffy 在评论中指出的那样,通过查看sys.modules)。

结果取决于您是否启用了site(您的Py_NoSiteFlag = 1; 暗示不是这种情况,但无论如何,我都会提供这两个选项:-))。

site 在你使用它时会拖拽几个额外的模块,比如_sitebuiltinsstat,总共你可以只使用以下命令运行 Python:

abc.py               encodings       os.py         _sitebuiltins.py  sysconfig.py
codecs.py            genericpath.py  posixpath.py  site.py           _collections_abc.py  
io.py                stat.py         _weakrefset.py

在禁用site 的情况下,您将被剥离为以下6

abc.py  codecs.py  encodings  io.py  os.py  _weakrefset.py

当通过CPy_Initialize()(或根据您的评论通过Windows)调用时,我猜os.py 可能实际上不需要。

【讨论】:

build 是什么意思?我能够在不超过encodings 包和sys.path 中的_weakrefsetabccodecsio 模块的情况下运行解释器。 对这些没有什么可做的,但仍然可以。 啊,我以为你是指整个过程(即获取 CPython 的源代码,构建它,然后运行它)。是的,为了简单地运行解释器,您需要我列出的模块/包的一小部分。既然您找到了所需的模块,我想您已经回答了自己的问题:-) @Jovito 如果您删除有关构建 Python 解释器的部分可能会更好,因为这不是问题所在,或者至少将有关实际运行它的部分移到你的答案的顶部:) 不是在 Windows 上,不是。【参考方案2】:

如果您按照 Charles Duffy 在评论中的建议运行解释器,您将加载像 readline 这样的包。我这样做已经有十年了,但是 IIRC 如果您使用 python 作为 C 程序的扩展,则不需要该模块,因为没有命令行交互。其他模块也可能如此。

确定真正需要什么的最快方法是将所有 lib/python3.5 放在程序可以找到的位置,然后在程序中打印出sys.modules,即会给你一个你的程序实际加载的列表,而不是解释器可能需要启动的列表。之后删除不在该列表中的所有内容。

【讨论】:

【参考方案3】:

这是另一种方法 - 询问 Python 解释器加载了哪些模块:

$ python3.5 -v -S -c '' |& grep SourceFileLoader | sort 
import 'abc' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d12e860>
import '_bootlocale' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d1367b8>
import 'codecs' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d187fd0>
import 'encodings.aliases' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d11eac8>
import 'encodings' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d187be0>
import 'encodings.latin_1' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d12e3c8>
import 'encodings.utf_8' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d12c898>
import 'io' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d12e5f8>
import '_weakrefset' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d135080>

_bootlocale 不是必需的,但建议使用。它用于初始化 sys.stdin/sys.stdout/sys.stderr 的最佳编码。见https://hg.python.org/cpython/rev/fbbf8b160e8d

sys.modules 可以说谎,因为它是可变的。

【讨论】:

以上是关于运行 Python 3.5 解释器需要哪些标准库模块?的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的虚拟环境中使用 Python 3 (3.5) 作为默认解释器?

如何找出在 Linux 上运行 Java 类需要哪些共享库?

python解释器有哪些?

22Python基础学习笔记1

.NET 3.5 中的 CultureInfo 类支持哪些文化?

从功能上讲,Python的一个程序通常包括哪些组成部分?