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

时间:2016-11-16 14:02:59

标签: python python-3.x python-3.5 python-internals python-embedding

这是一个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)

除了encodings包之外,Python 3.5标准库中的哪些包和模块是运行Python 3.5解释器所必需的?在我的文档中似乎没有这些信息。

3 个答案:

答案 0 :(得分:7)

这些是在口​​译员启动期间使用的包/模块(如@Charles Duffy在评论中所述,通过查看sys.modules)。

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

当您使用site_sitebuiltins时,

stat会使用它拖动其他几个模块,总之,您只能使用以下内容运行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

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

答案 1 :(得分:1)

如果你像Charles Duffy在评论中建议的那样运行翻译,你将加载像readline这样的包。我做了这个已经十年了,但是如果你使用python作为你的C程序的扩展,你不需要那个模块,因为没有命令行交互。对于其他模块也是如此。

通过将所有lib / python3.5放在程序可以找到它的位置,并且在程序中打印出sys.modules,确定真正需要的最快方法只需要很少的机会。 ,这将为您提供实际加载的您的程序的列表,而不是解释器可能需要启动的内容。之后删除不在该列表上的所有内容。

答案 2 :(得分:1)

这是另一种方法 - 询问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可以撒谎,因为它是可变的。