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) ... |
'언어 > 파이썬 & 장고' 카테고리의 다른 글
[Python] Tip - 키워드 전용 인수로 명료성을 강요 (0) | 2016.10.21 |
---|---|
[Python] Tip - 동적 기본 인수를 지정하려면 None과 docstring을 사용 (0) | 2016.10.21 |
[Python] assert() (0) | 2016.10.21 |
[Python] 동적 import 추가 (3) | 2016.10.18 |
[Python] Tip - 가변 위치 인수로 깔끔하게 코딩 (0) | 2016.10.16 |
[Python] Tip - 인수를 순회할 때는 방어적으로 (0) | 2016.10.16 |
[Python] Tip - 리스트 대신 제너레이터를 반환하도록 하자 (0) | 2016.10.16 |
-
메카걸 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]")-
먼저 저는 파이썬 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() 요렇게..
-