본문 바로가기
Python/Python FAQ

Python 문자열로 된 모듈 이름을 동적으로 가져오는 방법은 무엇인가요?, How can I import a module dynamically given its name as string?

by 베타코드 2023. 8. 1.
반응형

질문


나는 명령어를 인수로 받는 파이썬 애플리케이션을 작성하고 있습니다. 예를 들어:

$ 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을 사용하여 모듈을 가져옵니다. globalslocals는 패키지 컨텍스트에서 이름을 해석하는 방법을 결정하는 데 사용될 수 있습니다. fromlistname으로 지정된 모듈에서 가져와야 하는 객체 또는 하위 모듈의 이름을 제공합니다.

출처: 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 2Python 3을 위해.

또는 __import__를 사용하여 다음과 같이 모듈 목록을 가져올 수 있습니다:

>>> moduleNames = ['sys', 'os', 're', 'unittest'] 
>>> moduleNames
['sys', 'os', 're', 'unittest']
>>> modules = map(__import__, moduleNames)

Dive Into Python에서 직접 가져온 것입니다.

반응형

댓글