为什么 Python 不允许从 ZIP 文件中导入 `*.so` 文件?

vog*_*vog 5 python zip python-import

为什么 Python 不允许从 ZIP 文件导入 *.so 文件?

文档(https://docs.python.org/2/library/zipimport.html)非常清楚:

ZIP 存档中可能存在任何文件,但只有文件 .py 和 .py[co] 可用于导入。动态模块(.pyd、.so)的 ZIP 导入是不允许的。

但是文档没有说明这种奇怪限制的任何原因。是因为在 Python 中通常不鼓励从 ZIP 文件导入吗?还是因为安全原因?如果有,是哪些?官方有没有关于这个的说法?

Eri*_*inn 5

PEP 273,子目录等效

您无法满足 zip 文件中的动态模块。动态模块具有类似延伸.dll.pyd.so。它们依赖于操作系统,并且可能无法从文件中加载。可以从 zip 文件中提取动态模块,将其写入普通文件并加载它。但这意味着创建临时文件,并处理所有dynload_*.c. ,这可能不是一个好主意。

我的解释是,做出这个决定是为了避免让解释器提取动态模块并将其保存到磁盘,因为操作系统的动态库工具不允许从 zip 中加载(请参阅 WindowsLoadLibraryA和 Linux dlopen)。

虽然看起来在技术上并非不可能,但为实现此功能而进行的工作可能不值得的一个原因是这些库的平台依赖性。甲.zip在Linux中包含被分布与依赖于它,如果它是从64位环境中创建在一个32位的环境下可能不工作的代码中的动态模块,也不会工作,如果它在视窗创建。在.zips 中禁止动态模块可能是一个有意识的决定,以确保.zip包含 Python 模块的 s 可以跨平台工作。