Bağımsız değişken olarak komut olarak alan bir Python uygulaması yazıyorum:
$ python myapp.py command1
Uygulamanın genişletilebilir olmasını, yani ana uygulama kaynağını değiştirmek zorunda kalmadan yeni komutlar uygulayan yeni modüller ekleyebilmek istiyorum. Ağaç şuna benzer:
myapp/
__init__.py
commands/
__init__.py
command1.py
command2.py
foo.py
bar.py
Uygulamanın çalışma zamanında mevcut komut modüllerini bulmasını ve uygun olanı çalıştırmasını istiyorum.
Python, bir modül adı için dize alan bir __import__ işlevini tanımlar :
__import __ (ad, globals = Yok, yerliler = Yok, listeden = (), seviye = 0)
İşlev, modül adını alır ve potansiyel olarak adın bir paket bağlamında nasıl yorumlanacağını belirlemek için verilen globalleri ve yerelleri kullanır. Fromlist adıyla verilen modülden içe aktarılması gereken nesnelerin veya alt modüllerin adlarını verir.
Kaynak: https://docs.python.org/3/library/functions.html# import
Yani şu anda bir şey var:
command = sys.argv[1]
try:
command_module = __import__("myapp.commands.%s" % command, fromlist=["myapp.commands"])
except ImportError:
# Display error message
command_module.run()
Bu iyi çalışıyor, sadece bu kod ile ne yaptığımızı başarmak için muhtemelen daha deyimsel bir yol olup olmadığını merak ediyorum.
Özellikle yumurta veya uzatma noktası kullanmak istemiyorum. Bu açık kaynaklı bir proje değil ve "eklenti" olmasını beklemiyorum. Mesele, ana uygulama kodunu basitleştirmek ve her yeni komut modülü eklendiğinde kodun değiştirilmesi ihtiyacını ortadan kaldırmaktır.
dir(__import__)
. Başlangıç listesi, "ad içe aktarma işleminden ..." ifadesini taklit etmek için bir ad listesi olmalıdır.
importlib
: stackoverflow.com/a/54956419/687896