질문
나는 명령어를 인수로 받는 파이썬 애플리케이션을 작성하고 있습니다. 예를 들어:
$ python myapp.py command1
애플리케이션을 확장 가능하게 만들고 싶습니다. 즉, 메인 애플리케이션 소스를 변경하지 않고 새로운 명령어를 구현하는 새로운 모듈을 추가할 수 있어야 합니다. 트리는 다음과 같이 구성됩니다:
myapp/
__init__.py
commands/
__init__.py
command1.py
command2.py
foo.py
bar.py
따라서 애플리케이션은 실행 시 사용 가능한 명령어 모듈을 찾아서 해당 모듈을 실행하도록 해야 합니다.
파이썬은 문자열로 모듈 이름을 받는 __import__()
함수를 정의합니다:
__import__(name, globals=None, locals=None, fromlist=(), level=0)
이 함수는 주어진
name
을 사용하여 모듈을 가져옵니다.globals
와locals
는 패키지 컨텍스트에서 이름을 해석하는 방법을 결정하는 데 사용될 수 있습니다.fromlist
는name
으로 지정된 모듈에서 가져와야 하는 객체 또는 하위 모듈의 이름을 제공합니다.출처: https://docs.python.org/3/library/functions.html#__import__
현재 다음과 같은 코드가 있습니다:
command = sys.argv[1]
try:
command_module = __import__("myapp.commands.%s" % command, fromlist=["myapp.commands"])
except ImportError:
# 에러 메시지 표시
command_module.run()
이 코드는 아주 잘 작동합니다. 그러나 아마도 이 코드를 수행하는 더 관용적인 방법이 있는지 궁금합니다.
알려드린 대로, 절대 경로로 모듈을 가져오는 방법에 대해 알아보세요: How do I import a module given the full path?
답변
Python 2.7/3.1보다 오래된 버전의 경우, 그것이 거의 그렇게 하는 방법입니다.
새로운 버전의 경우, importlib.import_module
을 참조하십시오. Python 2 및 Python 3을 위해.
또는 __import__
를 사용하여 다음과 같이 모듈 목록을 가져올 수 있습니다:
>>> moduleNames = ['sys', 'os', 're', 'unittest']
>>> moduleNames
['sys', 'os', 're', 'unittest']
>>> modules = map(__import__, moduleNames)
Dive Into Python에서 직접 가져온 것입니다.
댓글