Saya sedang menulis aplikasi Python yang mengambil sebagai perintah sebagai argumen, misalnya:
$ python myapp.py command1
Saya ingin aplikasi dapat dikembangkan, yaitu, untuk dapat menambahkan modul baru yang mengimplementasikan perintah baru tanpa harus mengubah sumber aplikasi utama. Pohon itu terlihat seperti:
myapp/
__init__.py
commands/
__init__.py
command1.py
command2.py
foo.py
bar.py
Jadi saya ingin aplikasi mencari modul perintah yang tersedia saat runtime dan menjalankan yang sesuai.
Python mendefinisikan fungsi __import__ , yang mengambil string untuk nama modul:
__import __ (nama, global = Tidak ada, penduduk setempat = Tidak ada, fromlist = (), level = 0)
Fungsi ini mengimpor nama modul, berpotensi menggunakan global dan lokal yang diberikan untuk menentukan cara menafsirkan nama dalam konteks paket. Thelistlist memberikan nama-nama objek atau submodul yang harus diimpor dari modul yang diberikan oleh nama.
Sumber: https://docs.python.org/3/library/functions.html# import
Jadi saat ini saya punya sesuatu seperti:
command = sys.argv[1]
try:
command_module = __import__("myapp.commands.%s" % command, fromlist=["myapp.commands"])
except ImportError:
# Display error message
command_module.run()
Ini berfungsi dengan baik, saya hanya ingin tahu apakah mungkin ada cara yang lebih idiomatis untuk mencapai apa yang kita lakukan dengan kode ini.
Perhatikan bahwa saya secara khusus tidak ingin menggunakan telur atau titik ekstensi. Ini bukan proyek open-source dan saya tidak berharap ada "plugin". Intinya adalah untuk menyederhanakan kode aplikasi utama dan menghapus kebutuhan untuk memodifikasinya setiap kali modul perintah baru ditambahkan.
dir(__import__)
. Daftar nama harus berupa daftar nama untuk ditiru "dari impor nama ...".
importlib
: stackoverflow.com/a/54956419/687896