zipimport 모듈이란?
Python의 zipimport 모듈을 사용하면 ZIP 형식 아카이브에서 Python 모듈과 패키지를 직접 가져올(import) 수 있습니다. 이 모듈은 sys.path 항목에 ZIP 파일 아카이브의 경로 문자열을 지정할 수 있도록 지원하며, ZIP 파일 내부의 코드를 마치 일반 디렉터리처럼 불러와 실행할 수 있게 해줍니다.
다만 몇 가지 제약 사항이 있습니다.
- ZIP 아카이브에는 어떤 파일이든 포함될 수 있지만, 실제로 임포트 가능한 파일은 .py와 .pyc뿐입니다.
- C 확장 모듈과 같은 동적 라이브러리(.pyd, .so 등)는 ZIP에서 직접 임포트할 수 없습니다.
테스트용 ZIP 아카이브 만들기
이 모듈의 기능을 살펴보기 위해 먼저 'newdir' 디렉터리에 있는 파일들로 ZIP 아카이브를 생성해 보겠습니다. newdir 디렉터리에는 다음과 같은 파일들이 있다고 가정합니다.
['guess.py', 'hello.py', 'impzip.py', 'mytest.py', 'prime.py', 'prog.py', 'tmp.py']
아래 코드는 zipfile.PyZipFile 클래스를 사용해 디렉터리 내의 모든 .py 파일을 하나의 ZIP 아카이브로 압축하는 예제입니다.
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 클래스의 주요 메서드
zipimport 모듈은 zipimporter 클래스를 정의하며, 이 클래스는 다음과 같은 메서드들을 제공합니다.
1. zipimporter() — 생성자
새로운 zipimporter 인스턴스를 생성하는 생성자입니다. 인자로 ZIP 파일의 경로를 받으며, 유효한 ZIP 아카이브가 아니면 ZipImportError가 발생합니다.
>>> import zipimport
>>> importer = zipimport.zipimporter('zipimp.zip')2. find_module() — 모듈 검색
지정된 모듈을 검색하는 메서드입니다. 모듈을 찾으면 해당 zipimporter 인스턴스를 반환하고, 찾지 못하면 None을 반환합니다.
>>> ret=importer.find_module('prime')
>>> ret
<zipimporter object "zipimp.zip">
>>> ret=importer.find_module('sample')
>>> ret
>>> print (ret)
None3. get_code() — 코드 객체 반환
지정된 모듈의 코드 객체(code object)를 반환하는 메서드입니다. 모듈을 찾을 수 없으면 ZipImportError가 발생합니다.
>>> prog=importer.get_code('prime')
>>> print (prog)
<code object <module> at 0x022A4650, file "zipimp.zip\prime.py", line 1>4. 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">위 출력 결과에서 볼 수 있듯이, 로드된 모듈의 __name__, __file__, __loader__ 속성을 통해 모듈 이름, ZIP 내부 경로, 그리고 로더 정보를 확인할 수 있습니다.
5. 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)마무리
zipimport 모듈은 배포 패키징 시 여러 모듈을 단일 ZIP 파일로 묶어 관리하고 싶을 때 유용하게 활용할 수 있습니다. 특히 sys.path에 ZIP 파일 경로를 추가하기만 하면 일반적인 import 문으로도 ZIP 내부의 모듈을 자동으로 불러올 수 있으므로, 간단한 애플리케이션 번들링이나 플러그인 구조 설계에 활용하기 좋습니다.