मैं एक अजगर ढांचा विकसित कर रहा हूं जिसमें "एडॉन्स" अलग पैकेज के रूप में लिखा होगा। यानी .:एक ही नामस्थान में अलग पायथन पैकेज डाल रहे हैं?
import myframework
from myframework.addons import foo, bar
अब, ताकि इन एडऑन कोर ढांचे से अलग से वितरित किया जा सकता और myframework.addons
नाम स्थान में इंजेक्शन है कि मैं क्या व्यवस्था करने के लिए कोशिश कर रहा हूँ है।
वर्तमान में मेरा सबसे अच्छा समाधान निम्न है। एक ऐड-ऑन {python_version}/site-packages/
में तैनात किया जाएगा, ताकि जैसे (सबसे अधिक संभावना:
fooext/
fooext/__init__.py
fooext/myframework/
fooext/myframework/__init__.py
fooext/myframework/addons/
fooext/myframework/addons/__init__.py
fooext/myframework/addons/foo.py
fooext/myframework/addons/__init__.py
pkgutil पथ विस्तार कोड होगा:
import pkgutil
__path__ = pkgutil.extend_path(__path__, __name__)
समस्या यह है कि इस काम करने के लिए, PYTHONPATH इसमें fooext/
होने की आवश्यकता है, हालांकि इसमें केवल एक चीज है जो मूल स्थापित निर्देशिका है (सबसे अधिक संभावना है, उपर्युक्त site-packages
)
इसका समाधानमें अतिरिक्त कोड होना हैजो sys.path
ट्रान्सवर्स करेगा और एक myframework उप-पैकेज के साथ किसी भी मॉड्यूल की तलाश करेगा, इस मामले में यह इसे sys.path
में जोड़ता है और सब कुछ काम करता है।
मुझे लगता है कि एडन फ़ाइलों को सीधे myframework/addons/
स्थान पर स्थापित करना एक और विचार है, लेकिन फिर यह विकास और तैनात नामस्थान भिन्न होगा।
क्या उपर्युक्त वितरण समस्या को पूरी तरह से या शायद एक अलग दृष्टिकोण को पूरा करने का एक बेहतर तरीका है?
नीचे एलेक का जवाब देखें। Setuptools के लिए कुछ ठीक है, जिसे entry_points कहा जाता है। –