मैं एक पायथन एप्लिकेशन लिख रहा हूं जो एक तर्क के रूप में एक कमांड के रूप में लेता है, उदाहरण के लिए:
$ python myapp.py command1
मैं चाहता हूं कि एप्लिकेशन को एक्स्टेंसिबल होना चाहिए, यानी मुख्य एप्लिकेशन स्रोत को बदलने के बिना नए आदेशों को लागू करने वाले नए मॉड्यूल को जोड़ने में सक्षम होना चाहिए। पेड़ कुछ इस तरह दिखता है:
myapp/
__init__.py
commands/
__init__.py
command1.py
command2.py
foo.py
bar.py
इसलिए मैं चाहता हूं कि एप्लिकेशन रनटाइम पर उपलब्ध कमांड मॉड्यूल को ढूंढे और उपयुक्त को निष्पादित करे।
पायथन एक __import__ फ़ंक्शन को परिभाषित करता है , जो एक मॉड्यूल नाम के लिए एक स्ट्रिंग लेता है:
__import __ (नाम, ग्लोबल्स = कोई नहीं, स्थानीय = कोई नहीं, सूची = (), स्तर = ०)
फ़ंक्शन मॉड्यूल नाम का आयात करता है, संभवतः दिए गए ग्लोबल्स और स्थानीय लोगों का उपयोग करके यह निर्धारित करने के लिए कि पैकेज संदर्भ में नाम की व्याख्या कैसे करें। Fromlist ऑब्जेक्ट या सबमॉड्यूल का नाम देता है जिसे नाम द्वारा दिए गए मॉड्यूल से आयात किया जाना चाहिए।
स्रोत: https://docs.python.org/3/library/functions.html# आयात
इसलिए वर्तमान में मेरे पास कुछ ऐसा है:
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__)
:। इस सूची को "नाम आयात से ..." का अनुकरण करने के लिए नामों की एक सूची होनी चाहिए।
importlib
: stackoverflow.com/a/54956419/687896