Python에서는 pip를 사용해 런타임에 패키지를 설치할 수 있고, importlib.import_module() 함수를 사용하면 모듈 이름을 문자열로 전달하여 동적으로 모듈을 가져올 수 있습니다. 이 두 가지 기능을 조합하면, 필요한 모듈이 아직 설치되어 있지 않은 경우 자동으로 설치한 후 바로 불러오는 코드를 작성할 수 있습니다.
자동 설치 후 모듈 가져오기 예제
import pip
import importlib
def import_with_auto_install(package):
try:
return importlib.import_module(package)
except ImportError:
pip.main(['install', package])
return importlib.import_module(package)
# 예시
if __name__ == '__main__':
scrapy = import_with_auto_install('scrapy')
print(scrapy)위 스크립트는 scrapy 모듈이 설치되어 있지 않으면 pip를 통해 자동으로 설치하고, 설치가 완료되면 해당 모듈을 임포트하여 반환합니다.
코드 동작 원리
importlib.import_module(package): 모듈 이름을 문자열로 받아 동적으로 임포트하는 표준 라이브러리 함수입니다.try / except ImportError: 모듈이 이미 설치되어 있는 경우 즉시 반환하고, 설치되어 있지 않으면ImportError가 발생했을 때 pip로 설치를 진행합니다.pip.main(['install', package]): 프로그램 실행 중에 명령어를 입력하지 않고도 패키지를 설치할 수 있게 해줍니다.
참고: 최신 pip 버전에서의 주의 사항
pip 10 이상부터는 pip.main()이 공식적으로 지원되지 않는 내부 API이므로, 실제 프로젝트에서는 subprocess 모듈을 사용해 pip를 호출하는 방식이 더 안전합니다.
import subprocess
import importlib
def import_with_auto_install(package):
try:
return importlib.import_module(package)
except ImportError:
subprocess.check_call(['python', '-m', 'pip', 'install', package])
return importlib.import_module(package)이처럼 런타임 자동 설치 기능은 배포 환경에 따라 의존성 문제를 유발할 수 있으므로, 일반적으로는 requirements.txt 등으로 사전에 의존성을 관리하는 것이 권장됩니다. 다만 간단한 스크립트나 데모 환경에서는 위와 같은 방식이 매우 유용하게 활용될 수 있습니다.