zipimport — Zip 아카이브에서 모듈 가져오기
zipimport — Zip 아카이브에서 모듈 가져오기
zipimport 모듈은 ZIP 형식 아카이브에서 Python 모듈(*.py, *.pyc)과 패키지를 가져올 수 있게 해 줘요. 보통 이 모듈을 직접 쓸 필요는 없어요. sys.path 항목이 ZIP 아카이브 경로일 때 내장 import 메커니즘이 자동으로 사용하기 때문입니다.
출처: Python 표준 라이브러리
본문
zipimport 모듈은 ZIP 형식 아카이브에서 Python 모듈(*.py, *.pyc)과 패키지를 가져올 수 있게 해 줍니다. 보통 zipimport를 명시적으로 쓸 필요는 없어요. sys.path 항목이 ZIP 아카이브 경로일 때 내장 import 메커니즘이 자동으로 사용하기 때문이죠.
보통 sys.path는 문자열 디렉터리 이름의 목록입니다. 이 모듈은 sys.path 항목으로 ZIP 파일 아카이브를 가리키는 문자열도 허용해요. ZIP 아카이브는 패키지 import를 지원하도록 하위 디렉터리 구조를 담을 수 있고, 아카이브 내 경로를 지정해 하위 디렉터리에서만 가져오게 할 수도 있습니다. 예를 들어 example.zip/lib/ 경로는 아카이브 안의 lib/ 하위 디렉터리에서만 import하게 해요.
ZIP 아카이브에는 어떤 파일이든 있을 수 있지만, importer는 .py와 .pyc 파일에 대해서만 호출됩니다. 동적 모듈(.pyd, .so)의 ZIP import는 허용되지 않아요. 아카이브에 .py 파일만 있고 .pyc는 없다면 Python이 아카이브에 .pyc를 추가하려 하지 않으므로, .pyc 파일이 없는 ZIP 아카이브의 import는 꽤 느릴 수 있다는 점을 알아 두세요.
버전 3.13에서 변경: ZIP64 지원. 버전 3.8에서 변경: 이전에는 아카이브 주석(archive comment)이 있는 ZIP 아카이브를 지원하지 않았습니다.
관련 자료로는 Phil Katz가 만든 ZIP 파일 형식 문서인 PKZIP Application Note와, James C. Ahlstrom이 작성하고 구현도 제공한 [PEP 273 - Import Modules from Zip Archives], 그리고 import 메커니즘의 구현인 importlib가 있어요. Python 2.3은 PEP 273의 명세를 따르지만 Just van Rossum이 PEP 302의 import 훅을 이용해 작성한 구현을 사용합니다.
exception zipimport.ZipImportError
zipimporter 객체가 일으키는 예외입니다. ImportError의 하위 클래스라서 ImportError로도 잡을 수 있어요.
zipimporter 객체
zipimporter는 ZIP 파일을 import하는 클래스입니다.
class zipimport.zipimporter(archivepath)
새 zipimporter 인스턴스를 만듭니다. archivepath는 ZIP 파일의 경로이거나 ZIP 파일 안의 특정 경로여야 해요. 예를 들어 foo/bar.zip/lib라는 archivepath는 ZIP 파일 foo/bar.zip 안의 lib 디렉터리에서 모듈을 찾습니다 (그 디렉터리가 존재한다면).
archivepath가 유효한 ZIP 아카이브를 가리키지 않으면 ZipImportError가 발생해요.
버전 3.12에서 변경: 3.10에서 비추천된
find_loader()·find_module()메서드가 제거되었습니다.find_spec()을 사용하세요.
create_module(spec)—importlib.abc.Loader.create_module()의 구현으로, 기본 의미를 명시적으로 요청하기 위해None을 반환합니다. (버전 3.10에서 추가)exec_module(module)—importlib.abc.Loader.exec_module()의 구현입니다. (버전 3.10에서 추가)find_spec(fullname, target=None)—importlib.abc.PathEntryFinder.find_spec()의 구현입니다. (버전 3.10에서 추가)get_code(fullname)— 지정한 모듈의 코드 객체를 반환합니다. 모듈을 import할 수 없으면ZipImportError를 일으켜요.get_data(pathname)—pathname과 연관된 데이터를 반환합니다. 파일을 찾지 못하면OSError를 일으켜요. (버전 3.3에서 변경: 이전엔IOError가 발생했는데 지금은OSError의 별칭)get_filename(fullname)— 지정한 모듈을 import했다면__file__이 설정될 값을 반환합니다. 모듈을 import할 수 없으면ZipImportError를 일으켜요. (버전 3.1에서 추가)get_source(fullname)— 지정한 모듈의 소스 코드를 반환합니다. 모듈을 찾지 못하면ZipImportError, 아카이브에 모듈이 있지만 소스가 없으면None을 반환해요.is_package(fullname)—fullname으로 지정한 모듈이 패키지이면True를 반환합니다. 모듈을 찾지 못하면ZipImportError를 일으켜요.load_module(fullname)—fullname으로 지정한 모듈을 로드합니다.fullname은 완전히 한정된(점으로 구분된) 모듈 이름이어야 해요. 성공하면 import한 모듈을, 실패하면ZipImportError를 반환합니다. (버전 3.10부터 비추천, 3.15에서 제거 예정 —exec_module()을 사용)invalidate_caches()— ZIP 아카이브 안에서 찾은 파일 정보의 내부 캐시를 비웁니다. (버전 3.10에서 추가)archive— 가능한 하위 경로를 뺀, importer와 연관된 ZIP 파일의 파일 이름입니다.prefix— 모듈을 찾는 ZIP 파일 내의 하위 경로입니다. ZIP 파일의 루트를 가리키는zipimporter객체의 경우 빈 문자열이에요.
archive와 prefix 속성을 슬래시로 합치면, zipimporter 생성자에 준 원래 archivepath 인자와 같아집니다.
예제
ZIP 아카이브에서 모듈을 import하는 예제입니다. zipimport 모듈을 명시적으로 쓰지 않는 점을 확인해 보세요.
$ unzip -l example_archive.zip
Archive: example_archive.zip
Length Date Time Name
-------- ---- ---- ----
8467 01-01-00 12:30 example.py
-------- -------
8467 1 file
>>> import sys
>>> # 모듈 검색 경로 맨 앞에 아카이브 추가
>>> sys.path.insert(0, 'example_archive.zip')
>>> import example
>>> example.__file__
'example_archive.zip/example.py'