-
[Python] 동적 import 추가언어/파이썬 & 장고 2016. 10. 18. 13:41
Python 의 모듈을 import 할때는 보통 파일 초기에 선언하여 사용하는게 일반적입니다. 하지만 import를 사용자의 input에 따라 다르게 선언하고 싶을 때 즉, 동적으로 import하고 싶을 때 아래와 같은 방법을 사용하면 실행할 수 있습니다.
importlib
import 하고 싶은 module명을 module_name 이라는 변수로 받았다고 가정하면 아래와 같이 쉽게 사용할 수 있습니다.
import importlib def load_module_func(module_name): tmp = importlib.import_module(module_name) return tmp
load_module_func 함수에서 받은 결과를 통해 module 안에 있는 class를 호출할 수 있습니다.
__import__()
importlib 보다 좀 더 low level 로 __import__ 를 이용해서도 구현이 가능합니다. __import__() 는 built-in 함수이기 때문에 추가적인 import가 필요 없습니다.
def load_module_func(module_name): # 방법 1 tmp = __import(module_name) instance = getattr(모듈경로, module_name) # 방법 2 tmp = __import__(module_name, fromlist=[module_name]) return tmp
방법 1의 경우처럼 쪼개서 사용하기 보단 방법 2처럼 한 줄로 표현하는 것이 깔끔합니다.
위 두 함수는 크게 차지가 없습니다. importlib는 import 구문(statement)을 수행하는 package 일 뿐이며, __import__() 함수는 import 구문을 구성하는 expression 이기 때문입니다. 즉, __import__() 함수는 importlib 보다 low level로 호출하는 것 뿐입니다.
또한 위의 코드에서처럼 getattr()을 통해 import한 모듈 내부의 class나 변수 자체에 접근이 가능합니다.
getattr()
getattr() 은 지정한 object의 속성을 문자열 형태로 접근이 가능하도록 하는 함수입니다. 이것을 이용하면 모듈의 class에 변수를 이용하여 접근이 가능합니다.
def load_module_func(module_name, module_class_name): tmp = __import__(module_name, fromlist=[module_name]) tmp_cls = getattr(tmp, module_class_name) return tmp_cls # tmp_cls.func1() tmp_cls.func2(arg1, arg2) ...