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)
...


  1. 메카걸 2016.12.12 17:36

    도움이 필요 해서 글 남깁니다.
    A.py에서 같은 폴더내에 있는 B.py 모듈을 __import__를 이용하여 동적으로 가져오려고 하는데
    계속 예외가 발생합니다.

    A.py는 대략 아래와 같이 코딩되어 있으며, python 2.7.3 버전입니다.
    __import__하는 함수인 ValueGet을 thread 내에서 호출하게 되어 있습니다.

    [A.py]
    def main():
    MyThread( ValueGet, ("B")).start() # thread 실행 함수

    def ValueGet(SSName):
    try:
    tmp = __import__(SSName, fromlist=[SSName])
    except:
    print("[Exception]")

    • 불곰1 2016.12.13 11:19 신고

      먼저 저는 파이썬 3.4 버전이여서 제가 생각하는 것과 다르게 동작할 수도 있습니다.

      [a.py]
      def main():
      # 모듈 선언 'import b' 와 동일함
      tmp = __import__('b', fromlist=['b'])

      # print를 찍어보면 b의 경로가 출력
      print(tmp)

      # b.py 의 test 변수를 호출하는 2가지 방법
      a = getattr(tmp, 'test')
      print(a)
      print(tmp.test)

      # b.py 의 times() 함수를 호출하는 2가지 방법
      b = getattr(tmp, 'times')
      print(b())
      print(tmp.times())

      main()

      [b.py]
      import time

      test = '12345'

      def times():
      return time.time()

      __import__를 한 다음 프린트를 찍어보시면 위의 예제와 같이 파일 경로만 확인됩니다. 한마디로 파일위치만 확인되고 내부의 어떠한 함수 및 변수가 있는지는 __import__만으로는 알 수가 없죠. (아닐수도..)

      B.py 모듈을 __import__를 사용해 동적으로 가져오려할 때, 먼저 tmp= __import__('B', fromlist['B']) 를 받은 다음 (좌변과 우변의 B는 B.py의 파일 경로입니다.), B.py에서 사용하실 변수나 함수를 호출하시면 됩니다.
      음.. B.py 에 test()라는 함수가 있다고 하면 tmp.test() 요렇게..

  2. 메카걸 2016.12.14 15:02

    비밀글로 했더니 답글이 보이질 않아서 비밀글 해제해서 다시 올립니다.
    도움 부탁드립니다.