为什么 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 中工作。禁止动态模块.zip
s 可能是一个有意识的决定,以确保.zip
包含 Python 模块的文件可以跨平台工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)