Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โมดูลนำเข้า Python จากไฟล์ Zip (zipimport)


การใช้โมดูล 'zipimport' ทำให้สามารถนำเข้าโมดูลและแพ็คเกจ Python จากไฟล์เก็บถาวรรูปแบบ ZIP ได้ โมดูลนี้ยังอนุญาตให้รายการของ sys.path เป็นสตริงที่ตั้งชื่อไฟล์ ZIP ที่เก็บถาวร ไฟล์ใดๆ อาจมีอยู่ในไฟล์ ZIP แต่มีเพียงไฟล์ .py และ .pyc เท่านั้นที่สามารถนำเข้าได้ ไม่อนุญาตให้นำเข้า ZIP ของโมดูลไดนามิก

การทำงานของโมดูลนี้อธิบายได้ด้วยการสร้างไฟล์ zip ในไดเร็กทอรี 'newdir' ก่อน ไฟล์ต่อไปนี้จะถือว่ามีอยู่ในไดเรกทอรี 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 ZipImportError จะปรากฏขึ้นหากไม่ใช่ไฟล์ ZIP ที่ถูกต้อง

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

find_module()

เมธอดนี้หาโมดูลที่ระบุ โดยจะส่งคืนอินสแตนซ์ zipimporter หากพบโมดูล หรือไม่มีหากไม่พบ

>>> 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)