簡體   English   中英

如果刪除不需要的 Python3 核心模塊,未來的第 3 方軟件包可能會出現什么問題

[英]What issues with future 3rd-party packages could be expected if removing unneeded Python3 core modules

我的環境有一些極端限制,需要我減少計划安裝的 Python 3.8.1 的大小。 操作系統未連接到 Internet,用戶永遠不會打開交互式 shell 或附加調試器。

當然有很多方法可以做到這一點,我正在探索的方法之一是刪除一些核心模塊,例如python3-email 我擔心未來的開發人員可能會在他們的應用程序中包含一些 3rd 方包,這些包對核心 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

對於我關於 3rd-party design Guidelines 的原始問題,有些人建議將 import 語句放在類中,而不是在模塊級別,但通常不會這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM