如果删除不需要的 Python3 核心模块,未来的 3rd 方软件包可能会出现什么问题



我有一个环境,有一些极端的限制,需要我减小计划的Python 3.8.1安装的大小。操作系统未连接到互联网,用户永远不会打开交互式外壳或附加调试器。

当然有很多方法可以做到这一点,我正在探索的方法之一是删除一些核心模块,例如python3-email.我担心未来的开发人员可能会在其应用程序中包含第 3 方软件包,这些软件包对核心 python 功能具有未使用但必需的依赖项。例如,如果缺少python3-email,哪些第三方软件包可能无法正常工作?如果开发人员决定在引用的模块中使用包含未引用EmailLogger类的日志记录包,它将中断,仅仅是因为它出现在顶部import email

是否存在解决此问题的包设计要求或指南?

这是一个有趣的问题,但它太宽泛了,无法在这里干净地回答。简而言之,Python 标准库应该始终存在,即使有时它会分成多个部分(例如 Debian(。但是你自己说,你不知道你的要求是什么,因为你还不知道未来的软件包会在这个解释器上运行......这是不可能回答的。你可以做的一件事是在未来的代码上使用类似modulefinder的东西,然后再让它在受约束的Python解释器上运行。

我能够找到解决方案。对我来说,这个问题最好被描述为级联进口。可以通过向sys.modules添加一个条目来阻止加载模块。例如,在导入asyncio模块时,将加载ssl_ssl模块,即使它们在 SSL 之外不需要。可以使用以下代码停止此操作。这可以通过看到 python 进程小 3MB 来验证,也可以通过使用模块加载钩子来观察每个模块的加载:

import importhook
import sys
sys.modules['ssl'] = None
@importhook.on_import(importhook.ANY_MODULE)
def on_any_import(module):
print(module.__spec__.name)
assert module.__spec__.name not in ['ssl', '_ssl']
import asyncio

对于我关于第三方设计指南的原始问题,有些人建议将导入语句放在模块级别的类中,但是这不是常规的。

最新更新