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

如果删除不需要的Python3核心模块,未来的第三方软件包可能会出现什么问题,python,python-3.x,pip,Python,Python 3.x,Pip,我的环境有一些极端的限制,要求我减少计划中的Python 3.8.1安装的大小。操作系统未连接到internet,用户永远不会打开交互式shell或附加调试器 当然有很多方法可以做到这一点,我正在探索的一种方法是删除一些核心模块,例如python3 email。我担心未来的开发人员可能会在他们的应用程序中包含一些第三方软件包,这些软件包对python的核心功能具有未使用但必需的依赖性。例如,如果缺少python3电子邮件,哪些第三方软件包可能无法正常工作?如果开发人员决定在引用的模块中使用包含未

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

当然有很多方法可以做到这一点,我正在探索的一种方法是删除一些核心模块,例如
python3 email
。我担心未来的开发人员可能会在他们的应用程序中包含一些第三方软件包,这些软件包对python的核心功能具有未使用但必需的依赖性。例如,如果缺少
python3电子邮件
,哪些第三方软件包可能无法正常工作?如果开发人员决定在引用的模块中使用包含未引用的
EmailLogger
类的日志包,它将中断,原因很简单,因为
import email
显示在顶部


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

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

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

导入导入OK
导入系统
系统模块['ssl']=无
@importhook.on\u导入(importhook.ANY\u模块)
任何导入(模块)上的def:
打印(模块规格名称)
断言模块。\规格\名称不在['ssl',''U ssl']
导入异步

对于我最初提出的关于第三方设计指南的问题,有些人建议将导入语句放在类中,而不是放在模块级别,但是这不是例行的操作。

您的问题非常有趣。我从来没有这样想过。但是你的目的只是减少软件区的大小,那么如何使用Python编译器呢?我投票结束这个问题,因为它是不可回答的。@martineau-包设计要求或指导原则是否存在是不可回答的?你明确提到了未来开发人员的需求。谁知道他们可能需要什么?准则是“不要碰标准库”。丹:@chepner评论解释了我自己的理由。这全是你的猜测。