来自Zip存档的Python导入模块(zipimport)

使用“ zipimport”模块可以从ZIP格式的归档文件中导入Python模块和软件包。该模块还允许sys.path项成为命名ZIP文件存档的字符串。ZIP档案中可能存在任何文件,但只有.py和.pyc文件可用于导入。不允许ZIP导入动态模块。

首先通过在'newdir'目录中构建文件的zip存档来说明该模块的功能。假定以下文件存在于newdir目录中

['guess.py','hello.py','impzip.py','mytest.py','prime.py','prog.py','tmp.py']

import sys, glob
import zipfile
files = glob.glob("*.py")
print (files)
zf = zipfile.PyZipFile('zipimp.zip', mode='w')
for file in files:
   zf.write(file)
zf.close()

现在,我们在本文的其余部分中使用“ zipimp.zip”。

“ zipimport”模块定义了zipimporter类,其中定义了以下方法

zipimporter ()

此方法是创建新的zipimporter实例的构造函数。它需要一个ZIP filea参数的路径。如果它不是有效的ZIP存档,则会引发ZipImportError。

>>> import zipimport
>>> importer = zipimport.zipimporter('zipimp.zip')

find_module()

对于指定的模块,此方法为earch。如果找到模块,则返回zipimporter实例;否则,返回None。

>>> ret=importer.find_module('prime')
>>> ret
<zipimporter object "zipimp.zip">
>>> ret=importer.find_module('sample')
>>> ret
>>> print (ret)
None

get_code()

此方法返回指定模块的代码对象,如果找不到该模块,则引发ZipImportError。

>>> prog=importer.get_code('prime')
>>> print (prog)
<code object <module> at 0x022A4650, file "zipimp.zip\prime.py", line 1>

load_module()

此方法加载指定的模块。它返回导入的模块,或者如果找不到则引发ZipImportError。

>>> importer = zipimport.zipimporter('zipimp.zip')
>>> mod=importer.load_module('prog')
30
>>> mod.__name__
'prog'
>>> mod.__file__
'zipimp.zip\\prog.py'
>>> mod.__loader__
<zipimporter object "zipimp.zip">

get_source()

此方法返回指定模块的源代码。

>>> prog=importer.get_source('prime')
>>> print (prog)
def isprime(x):
   for i in range(2,x-1):
      if x%i==0:
      return False
   else:
return True
f = int(input())
l = int(input())
primelist = list(filter(isprime, range(f,l)))
print ("prime1", "prime2", "composites")
composites=[(primelist[i-1], primelist[i],(primelist[i]-1)-primelist[i-1]) for i in range(1,len(primelist))]
print (composites)