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

2023-11-25

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

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

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

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


From PEP 273,子目录等效项:

您无法从 zip 文件中满足动态模块的要求。动态模块 有类似的扩展名.dll, .pyd, and .so。它们是操作系统 依赖,并且除了从文件中之外可能无法加载。它可能 可以从zip文件中提取动态模块,写入它 到一个普通文件并加载它。但这意味着创建临时的 文件,并处理所有dynload_*.c,这可能不是 好主意。

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

虽然看起来在技术上并非不可能,但实现此功能的工作可能不值得的原因是这些库的平台依赖性。 A.zip包含与依赖它的代码一起分发的动态模块,如果它是从 64 位环境创建的,则可能无法在 32 位环境中工作;如果它是在 Windows 中创建的,则可能无法在 Linux 中工作。禁止动态模块.zips 可能是一个有意识的决定,以确保.zip包含 Python 模块的文件可以跨平台工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Python 不允许从 ZIP 文件导入“*.so”文件? 的相关文章

随机推荐