运行 Python 3.5 解释器需要哪些标准库模块?
Which standard library modules are required to run the Python 3.5 interpreter?
这是一个 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 [=16] 绝对需要的=] 口译员?在我看来,文档中没有此信息。
这些是在解释器启动期间使用的 packages/modules(@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
。
如果您 运行 像 Charles Duffy 在他的评论中建议的解释器,您将加载像 readline
这样的包。我这样做已经十年了,但是如果你使用 python 作为 C 程序的扩展,IIRC 你不需要那个模块,因为没有命令行交互。其他模块可能也是如此。
确定真正需要什么的最快方法是将所有 lib/python3.5 放在程序可以找到的地方,然后在程序中打印出 sys.modules
,这将为您提供 您的程序 实际加载内容的列表,而不是解释器可能需要启动的内容。之后删除不在该列表中的所有内容。
这是另一种方法 - 询问 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
可以撒谎,因为它是可变的。
这是一个 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 [=16] 绝对需要的=] 口译员?在我看来,文档中没有此信息。
这些是在解释器启动期间使用的 packages/modules(@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
。
如果您 运行 像 Charles Duffy 在他的评论中建议的解释器,您将加载像 readline
这样的包。我这样做已经十年了,但是如果你使用 python 作为 C 程序的扩展,IIRC 你不需要那个模块,因为没有命令行交互。其他模块可能也是如此。
确定真正需要什么的最快方法是将所有 lib/python3.5 放在程序可以找到的地方,然后在程序中打印出 sys.modules
,这将为您提供 您的程序 实际加载内容的列表,而不是解释器可能需要启动的内容。之后删除不在该列表中的所有内容。
这是另一种方法 - 询问 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
可以撒谎,因为它是可变的。