ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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)
    ...


    댓글