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

时间:2017-05-29 18:15:13

标签: python zip python-import

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

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

  

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

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

1 个答案:

答案 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可以跨平台工作。