आप कई स्थानों में पूर्ण पथ, फ़ाइल, वर्ग, और समारोह के नाम हार्डकोड से बचना चाहते हैं, तो आप इसे एक पैकेज के उपनिर्देशिका में पाता है जिसके बाद गतिशील (लगभग) का आयात करता है की तरह कुछ कर सकता है सभी अजगर फ़ाइलें ।
कुंजी याद रखना है कि __init__.py
फ़ाइल एक बड़े पैमाने पर अनियंत्रित पायथन स्क्रिप्ट है, और इसलिए पैकेज के नामस्थान में क्या है यह निर्धारित करने के लिए अपने आप को काफी परिष्कृत प्रसंस्करण करने के लिए स्वतंत्र है।
फ़ाइल package\__init__.py
:
def _import_package_files():
""" Dynamically import all the Python modules in this module's sub directory. """
import os
import sys
import traceback
package_path = os.path.split(__file__)[0]
package_directory = os.path.split(package_path)[1]
for fn in os.listdir(package_directory):
globals_, locals_ = globals(), locals()
# process all python files in directory that don't start with underscore
if fn[0] != '_' and fn.split('.')[-1] in ('py', 'pyw'):
modulename = fn.split('.')[0] # filename without extension
subpackage = ".".join([package_directory, modulename])
try:
module = __import__(subpackage, globals_, locals_, [modulename])
except:
traceback.print_exc(file=sys.stdout)
raise # reraise exception
_import_package_files()
फ़ाइल package\Class1.py
:
class Class1(object):
pass
फ़ाइल package\Class2.py
:
class Class2(object):
pass
फ़ाइल package\Class3.py
:
class Class3(object):
pass
फ़ाइल usepackage.py
: usepackage.py
चलने से
import package
print(package.Class1)
print(package.Class2)
print(package.Class3)
आउटपुट:
<module 'package.Class1' from 'C:\Files\package\Class1.pyc'>
<module 'package.Class2' from 'C:\Files\package\Class2.pyc'>
<module 'package.Class3' from 'C:\Files\package\Class3.pyc'>
पूर्ववर्ती डॉट क्या मतलब है? – samuil
@ सैमुइल: http://www.python.org/dev/peps/pep-0328/ –
अफसोस की बात है, मैं पाइथन 2.4 तक सीमित हूं, क्योंकि स्क्रिप्ट तीसरे पक्ष के एम्बेडेड डिवाइस पर चलेंगे। यह डॉट नोटेशन विरासत संस्करण में काम नहीं कर रहा है। मैंने इसे इन सब-मॉड्यूल के पूर्ण पथ से बदल दिया है। – samuil