为什么在Python中不允许从ZIP文件中导入* .so文件?
文档(https://docs.python.org/2/library/zipimport.html)非常明确:
ZIP存档中可能存在任何文件,但只有文件.py和.py [co]可供导入。不允许ZIP导入动态模块(.pyd,.so)。
但是文档没有说明这个奇怪限制的任何原因。是因为在Python中通常不鼓励从ZIP文件导入?还是因为安全原因?如果是这样,哪些?是关于此的任何官方声明吗?
答案 0 :(得分:1)
来自PEP 273, Subdirectory Equivalence:
您无法满足zip文件中的动态模块的要求。动态模块 具有扩展名,例如
.dll
,.pyd
和.so
。他们是操作系统 依赖,除非从文件加载,否则可能无法加载。它可能 可以从zip文件中提取动态模块,然后将其写入 到一个普通文件并加载它。但这意味着创建临时 文件,并处理所有dynload_*.c
,这可能不是 好主意。
我的解释是,此决定是为了避免让解释器提取动态模块并将其保存到磁盘,因为操作系统的动态库功能不允许从zip中加载(请参见Windows的{{3} }和Linux的LoadLibraryA
)。
尽管从技术上看这并不是不可能,但是进行这些工作可能不值得的原因是这些库的平台依赖性。如果一个.zip
包含一个动态模块,并且该模块随其依赖的代码一起分发,那么如果它是从64位环境中创建的,则它不能在32位环境中工作,而如果是从64位环境中创建的,则不能在Linux中工作在Windows中创建。禁止在.zip
中使用动态模块可能是一个明智的决定,以确保包含Python模块的.zip
可以跨平台工作。