zipimport — Zip 아카이브에서 모듈 가져오기

zipimport — Zip 아카이브에서 모듈 가져오기

이 모듈은 ZIP 형식 아카이브에서 Python 모듈(*.py, *.pyc)과 패키지를 가져올 수 있는 능력을 추가해요. 보통 zipimport 모듈을 명시적으로 사용할 필요는 없어요. ZIP 아카이브 경로인 sys.path 항목에 대해 내장 import 메커니즘이 자동으로 사용해요.

일반적으로 sys.path는 디렉터리 이름 문자열의 목록이에요. 이 모듈은 sys.path의 항목이 ZIP 파일 아카이브를 지정하는 문자열이 되도록 허용해요. ZIP 아카이브는 패키지 import를 지원하는 하위 디렉터리 구조를 포함할 수 있고, 아카이브 내의 경로를 지정해 하위 디렉터리에서만 가져올 수 있어요. 예를 들어 example.zip/lib/ 경로는 아카이브 내의 lib/ 하위 디렉터리에서만 가져와요.

출처: Python documentation

본문

ZIP 아카이브에는 어떤 파일이든 있을 수 있지만, importer는 .py.pyc 파일에 대해서만 호출돼요. 동적 모듈(.pyd, .so)의 ZIP import는 허용되지 않아요. 아카이브에 .py 파일만 있으면 Python이 해당 .pyc 파일을 추가해 아카이브를 수정하려 하지 않을 것이므로, ZIP 아카이브에 .pyc 파일이 없다면 import가 상당히 느릴 수 있어요. 버전 3.13에서 ZIP64가 지원돼요.

exceptionzipimport.ZipImportError

zipimporter 객체가 발생시키는 예외. ImportError의 하위 클래스이므로 ImportError로도 잡을 수 있어요.

zipimporter 객체 (zipimporter Objects)

zipimporter는 ZIP 파일을 import하기 위한 클래스예요.

classzipimport.zipimporter(archivepath)

새 zipimporter 인스턴스를 만들어요. archivepath는 ZIP 파일의 경로 또는 ZIP 파일 내 특정 경로여야 해요. 예를 들어 foo/bar.zip/lib의 archivepath는 ZIP 파일 foo/bar.zip 내의 lib 디렉터리에서 모듈을 찾아요(존재한다면). archivepath가 유효한 ZIP 아카이브를 가리키지 않으면 ZipImportError가 발생해요.

메서드:

  • create_module(spec) — 명시적으로 기본 의미론을 요청하는 None을 반환하는 importlib.abc.Loader.create_module() 구현
  • exec_module(module)importlib.abc.Loader.exec_module() 구현
  • find_spec(fullname, target=None)importlib.abc.PathEntryFinder.find_spec() 구현
  • get_code(fullname) — 지정된 모듈의 코드 객체를 반환. 모듈을 import할 수 없으면 ZipImportError 발생
  • get_data(pathname)pathname과 관련된 데이터를 반환. 파일을 찾지 못하면 OSError 발생
  • get_filename(fullname) — 지정된 모듈이 import되면 __file__로 설정될 값을 반환
  • get_source(fullname) — 지정된 모듈의 소스 코드를 반환. 찾을 수 없으면 ZipImportError, 모듈은 있지만 소스가 없으면 None 반환
  • is_package(fullname)fullname이 지정한 모듈이 패키지이면 True 반환
  • load_module(fullname)fullname이 지정한 모듈을 로드. 성공 시 import된 모듈 반환, 실패 시 ZipImportError 발생. 버전 3.10에서 더 이상 사용되지 않고 3.15에서 제거 예정
  • invalidate_caches() — ZIP 아카이브 내에서 발견된 파일에 대한 정보의 내부 캐시를 지움

속성:

  • archive — importer와 연관된 ZIP 파일의 파일 이름(가능한 하위 경로 제외)
  • prefix — 모듈이 검색되는 ZIP 파일 내 하위 경로. ZIP 파일 루트를 가리키는 zipimporter 객체의 경우 빈 문자열이에요.

예제 (Examples)

ZIP 아카이브에서 모듈을 import하는 예제 — zipimport 모듈이 명시적으로 사용되지 않는다는 점에 주의하세요:

$ unzip -l example_archive.zip
Archive:  example_archive.zip
  Length     Date   Time    Name
  --------    ----   ----    ----
     8467  01-01-00 12:30   example.py
>>> import sys
>>> # 아카이브를 모듈 검색 경로 앞에 추가
>>> sys.path.insert(0, 'example_archive.zip')
>>> import example
>>> example.__file__
'example_archive.zip/example.py'

더 알아보기 (Learn more)