예를 들어 인수로 명령으로 사용하는 Python 응용 프로그램을 작성 중입니다.
$ python myapp.py command1
응용 프로그램을 확장 가능하게, 즉 주 응용 프로그램 소스를 변경하지 않고도 새 명령을 구현하는 새 모듈을 추가 할 수 있기를 원합니다. 나무는 다음과 같습니다.
myapp/
__init__.py
commands/
__init__.py
command1.py
command2.py
foo.py
bar.py
따라서 응용 프로그램이 런타임에 사용 가능한 명령 모듈을 찾아서 적절한 모듈을 실행하기를 원합니다.
파이썬은 __import__ 함수를 정의합니다.이 함수는 모듈 이름에 문자열을 사용합니다.
__import __ (이름, 전역 = 없음, 지역 주민 = 없음, 보낸 사람 목록 = (), 수준 = 0)
이 함수는 모듈 이름을 가져오고 주어진 전역 및 지역을 사용하여 패키지 컨텍스트에서 이름을 해석하는 방법을 결정합니다. fromlist는 이름으로 지정된 모듈에서 가져와야하는 오브젝트 또는 서브 모듈의 이름을 제공합니다.
출처 : 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:
# Display error message
command_module.run()
이것은 잘 작동합니다.이 코드로 수행하는 작업을 수행하는 더 관용적 인 방법이 있는지 궁금합니다.
계란이나 확장 점을 사용하고 싶지는 않습니다. 이것은 오픈 소스 프로젝트가 아니며 "플러그인"이있을 것으로 기대하지 않습니다. 요점은 주 응용 프로그램 코드를 단순화하고 새 명령 모듈이 추가 될 때마다 코드를 수정할 필요가 없다는 것입니다.
dir(__import__)
. fromlist는 "from name import ..."를 에뮬레이트 할 이름 목록이어야합니다.
importlib
. stackoverflow.com/a/54956419/687896