जवाबों:
यह पैकेज का एक आवश्यक हिस्सा हुआ करता था ( पुराना, प्री-3.3 "रेगुलर पैकेज" , न कि नया 3.3+ "नेमस्पेस पैकेज" )।
पायथन दो प्रकार के पैकेज, नियमित पैकेज और नेमस्पेस पैकेज को परिभाषित करता है। नियमित पैकेज पारंपरिक पैकेज हैं क्योंकि वे पायथन 3.2 और पूर्व में मौजूद थे। एक नियमित पैकेज को आमतौर पर एक निर्देशिका के रूप में लागू किया जाता है जिसमें एक
__init__.py
फ़ाइल होती है। जब एक नियमित पैकेज आयात किया जाता है, तो यह__init__.py
फ़ाइल अंतर्निहित रूप से निष्पादित होती है, और इसे परिभाषित करने वाली वस्तुएं पैकेज के नामों में नामों से बंधी होती हैं।__init__.py
फ़ाइल एक ही अजगर कोड है कि किसी भी अन्य मॉड्यूल शामिल कर सकते हैं शामिल कर सकते हैं, और जब यह आयात किया जाता है पायथन मॉड्यूल के लिए कुछ अतिरिक्त विशेषताओं को जोड़ने जाएगा।
लेकिन बस लिंक पर क्लिक करें, इसमें एक उदाहरण, अधिक जानकारी और नाम स्थान पैकेज की व्याख्या, बिना पैकेज के प्रकार शामिल हैं __init__.py
।
sys.path.insert(0, '/path/to/datetime')
, उस पथ को उस पथ के साथ प्रतिस्थापित करें जो आपने अभी-अभी जो भी निर्देशिका बनाई है। अब जैसे कुछ कोशिश करो from datetime import datetime;datetime.now()
। आपको एक एट्रीब्यूट (क्योंकि यह अभी आपकी खाली फ़ाइल आयात कर रहा है) मिलना चाहिए। यदि आप रिक्त इनिट फ़ाइल बनाए बिना इन चरणों को दोहराते हैं, तो ऐसा नहीं होगा। इसे रोकने का इरादा है।
from datetime import datetime
त्रुटि के बिना जारी कर सकते हैं । यह 2.3 संस्करण के लिए सभी तरह से अच्छा है!
builtins
बिल्ट-इन फ़ंक्शन और क्लासेस , बिल्ट-इन मॉड्यूल नहीं (cf. docs.python.org/3/tutorial/modules.html#the-dir-function )। यदि आप अंतर्निहित मॉड्यूल सूचीबद्ध करना चाहते हैं , तो import sys; print(sys.builtin_module_names)
(cf. docs.python.org/3/library/sys.html#sys.builtin_module_names ) करें।
नामित फ़ाइलों __init__.py
का उपयोग डिस्क पर निर्देशिकाओं को पायथन पैकेज निर्देशिकाओं के रूप में चिह्नित करने के लिए किया जाता है। अगर आपके पास फाइलें हैं
mydir/spam/__init__.py
mydir/spam/module.py
और mydir
अपने रास्ते पर है, तो आप में कोड आयात कर सकते हैं module.py
के रूप में
import spam.module
या
from spam import module
यदि आप __init__.py
फ़ाइल को हटाते हैं , तो पायथन अब उस निर्देशिका के अंदर सबमॉडल्स की तलाश नहीं करेगा, इसलिए मॉड्यूल आयात करने का प्रयास विफल हो जाएगा।
__init__.py
फ़ाइल आमतौर पर खाली है, लेकिन और अधिक सुविधाजनक नाम, पकड़ सुविधा काम करता है, आदि उपरोक्त उदाहरण को देखते हुए के तहत पैकेज के चयनित भागों निर्यात करने के लिए इस्तेमाल किया जा सकता, init मॉड्यूल की सामग्री के रूप में पहुँचा जा सकता है
import spam
के आधार पर इस
__init__.py
पायथन 2.X के तहत फ़ाइल की आवश्यकता थी और अभी भी पायथन 2.7.12 (मैंने इसे परीक्षण किया है) के तहत आवश्यक है, लेकिन यह अब (कथित रूप से) पायथन 3.3 से आगे की आवश्यकता नहीं है, और पायथन 3.4.3 (I के तहत आवश्यक नहीं है) इसका परीक्षण किया गया)। अधिक जानकारी के लिए stackoverflow.com/questions/37139786 देखें ।
__init__.py
।
setup.py
और आप इसका इस्तेमाल find_packages()
करते हैं तो __init__.py
हर डायरेक्टरी में इसका होना जरूरी है । देखें stackoverflow.com/a/56277323/7127824
एक निर्देशिका को पायथन पैकेज के रूप में लेबल करने और परिभाषित करने के अलावा __all__
, __init__.py
आप पैकेज स्तर पर किसी भी चर को परिभाषित करने की अनुमति देता है। ऐसा करना अक्सर सुविधाजनक होता है अगर कोई पैकेज ऐसी चीज को परिभाषित करता है जिसे अक्सर आयात किया जाएगा, एपीआई-जैसे फैशन में। यह पैटर्न पाइथोनिक "फ्लैट नेस्टेड से बेहतर है" दर्शन के पालन को बढ़ावा देता है।
यहाँ मेरी परियोजनाओं, जिसमें मैं अक्सर आयात एक में से एक से एक उदाहरण है sessionmaker
कहा जाता है Session
मेरी डेटाबेस के साथ बातचीत करने। मैंने कुछ मॉड्यूल के साथ "डेटाबेस" पैकेज लिखा:
database/
__init__.py
schema.py
insertions.py
queries.py
मेरा __init__.py
कोड निम्नलिखित है:
import os
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)
चूंकि मैं Session
यहां परिभाषित करता हूं , इसलिए मैं नीचे दिए गए सिंटैक्स का उपयोग करके एक नया सत्र शुरू कर सकता हूं। यह कोड "डेटाबेस" पैकेज निर्देशिका के अंदर या बाहर से निष्पादित किया जाएगा।
from database import Session
session = Session()
बेशक, यह एक छोटी सुविधा है - विकल्प Session
मेरे डेटाबेस पैकेज में "create_session.py" जैसी एक नई फ़ाइल में परिभाषित होगा , और नए सत्रों का उपयोग करना शुरू करेगा:
from database.create_session import Session
session = Session()
यहाँ पर उचित उपयोग के लिए एक बहुत ही रोचक रेडिट धागा __init__.py
है:
http://www.reddit.com/r/Python/comments/1bbbwk/whats_your_opinion_on_what_to_include_in_init_py/
बहुमत की राय से ऐसा प्रतीत होता है कि __init__.py
"स्पष्ट रूप से निहित से बेहतर है" दर्शन का उल्लंघन करने से बचने के लिए फाइलें बहुत पतली होनी चाहिए।
engine
, sessionmaker
, create_engine
, और os
सब भी से आयात किया जा सकता database
है अब ... लगता है कि आपको लगता है कि नाम स्थान की गड़बड़ी कर दिया है।
__all__ = [...]
जो आयात करते हैं, उसे सीमित करने के लिए उपयोग कर सकते हैं import *
। लेकिन उस तरफ से, हाँ, आप एक गन्दा शीर्ष-स्तरीय नाम स्थान छोड़ गए हैं।
इसके 2 मुख्य कारण हैं __init__.py
सुविधा के लिए: अन्य उपयोगकर्ताओं को आपके पैकेज पदानुक्रम में आपके कार्यों के सटीक स्थान को जानने की आवश्यकता नहीं होगी।
your_package/
__init__.py
file1.py
file2.py
...
fileN.py
# in __init__.py
from file1 import *
from file2 import *
...
from fileN import *
# in file1.py
def add():
pass
फिर अन्य लोग कॉल () जोड़ सकते हैं
from your_package import add
file1 को जाने बिना, जैसे
from your_package.file1 import add
यदि आप चाहते हैं कि कुछ प्रारंभिक हो; उदाहरण के लिए, लॉगिंग (जिसे शीर्ष स्तर पर रखा जाना चाहिए):
import logging.config
logging.config.dictConfig(Your_logging_config)
__init__.py
कभी-कभी उपयोगी हो सकता है, लेकिन हर समय नहीं।
__init__.py
फ़ाइल अजगर इलाज मॉड्यूल के रूप में यह युक्त निर्देशिका बनाता है।
इसके अलावा, यह एक मॉड्यूल में लोड की जाने वाली पहली फाइल है, इसलिए आप इसे कोड को निष्पादित करने के लिए उपयोग कर सकते हैं जिसे आप हर बार मॉड्यूल लोड होने पर चलाना चाहते हैं, या निर्यात किए जाने वाले सबमॉड्यूल निर्दिष्ट करें।
पायथन 3.3 के बाद से, __init__.py
अब निर्देशिकाओं को आयात करने योग्य पायथन पैकेजों के रूप में परिभाषित करने की आवश्यकता नहीं है।
PEP 420 की जाँच करें : अंतर्निहित नाम स्थान पैकेज :
पैकेज निर्देशिकाओं के लिए मूल समर्थन, जिन्हें
__init__.py
मार्कर फ़ाइलों की आवश्यकता नहीं होती है और स्वचालित रूप से कई पथ खंडों को प्रेरित कर सकते हैं (नामस्थान पैकेजों के लिए विभिन्न तृतीय पक्ष द्वारा प्रेरित, जैसा कि पीईपी 420 में वर्णित है )
यहाँ परीक्षण है:
$ mkdir -p /tmp/test_init
$ touch /tmp/test_init/module.py /tmp/test_init/__init__.py
$ tree -at /tmp/test_init
/tmp/test_init
├── module.py
└── __init__.py
$ python3
>>> import sys
>>> sys.path.insert(0, '/tmp')
>>> from test_init import module
>>> import test_init.module
$ rm -f /tmp/test_init/__init__.py
$ tree -at /tmp/test_init
/tmp/test_init
└── module.py
$ python3
>>> import sys
>>> sys.path.insert(0, '/tmp')
>>> from test_init import module
>>> import test_init.module
संदर्भ:
https://docs.python.org/3/whatsnew/3.3.html#pep-420-implicit-namespace-packages
https://www.python.org/dev/peps/pep-0420/
Is__init__। अजगर 3 में संकुल की आवश्यकता नहीं है?
पायथन में पैकेज की परिभाषा बहुत सरल है। जावा की तरह पदानुक्रमित संरचना और निर्देशिका संरचना समान हैं। लेकिन आपके पास __init__.py
एक पैकेज में होना चाहिए। मैं नीचे __init__.py
दिए गए उदाहरण के साथ फाइल की व्याख्या करूंगा :
package_x/
|-- __init__.py
|-- subPackage_a/
|------ __init__.py
|------ module_m1.py
|-- subPackage_b/
|------ __init__.py
|------ module_n1.py
|------ module_n2.py
|------ module_n3.py
__init__.py
खाली हो सकता है, जब तक यह मौजूद है। यह इंगित करता है कि निर्देशिका को एक पैकेज के रूप में माना जाना चाहिए। बेशक, __init__.py
उपयुक्त सामग्री भी सेट कर सकते हैं।
यदि हम मॉड्यूल_ एन 1 में एक फ़ंक्शन जोड़ते हैं:
def function_X():
print "function_X in module_n1"
return
चलने के बाद:
>>>from package_x.subPackage_b.module_n1 import function_X
>>>function_X()
function_X in module_n1
फिर हमने पदानुक्रम पैकेज का अनुसरण किया और मॉड्यूल_ एन 1 फ़ंक्शन को बुलाया। हम __init__.py
इस तरह subPackage_b में उपयोग कर सकते हैं :
__all__ = ['module_n2', 'module_n3']
चलने के बाद:
>>>from package_x.subPackage_b import *
>>>module_n1.function_X()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named module_n1
इसलिए * आयात का उपयोग करके, मॉड्यूल पैकेज __init__.py
सामग्री के अधीन है।
from package_x.subPackage_b.module_n1 import function_X
हालांकि पायथन एक __init__.py
फ़ाइल के बिना काम करता है लेकिन आपको अभी भी एक को शामिल करना चाहिए।
यह निर्दिष्ट करता है कि एक पैकेज को एक मॉड्यूल के रूप में माना जाना चाहिए, इसलिए इसे शामिल करें (भले ही यह खाली हो)।
वहाँ भी एक मामला है जहाँ आप वास्तव में एक __init__.py
फ़ाइल का उपयोग कर सकते हैं :
कल्पना करें कि आपके पास निम्न फ़ाइल संरचना थी:
main_methods
|- methods.py
और methods.py
इसमें निहित है:
def foo():
return 'foo'
उपयोग करने के लिए foo()
आपको निम्नलिखित में से एक की आवश्यकता होगी:
from main_methods.methods import foo # Call with foo()
from main_methods import methods # Call with methods.foo()
import main_methods.methods # Call with main_methods.methods.foo()
हो सकता है कि आपको methods.py
अंदर रखने की आवश्यकता हो (या चाहते हैं) main_methods
(उदाहरण के लिए रनटाइम / निर्भरता), लेकिन आप केवल आयात करना चाहते हैं main_methods
।
यदि आपने नाम बदल दिया methods.py
है __init__.py
तो आप foo()
केवल आयात करके उपयोग कर सकते हैं main_methods
:
import main_methods
print(main_methods.foo()) # Prints 'foo'
यह काम करता है क्योंकि __init__.py
पैकेज के हिस्से के रूप में माना जाता है।
कुछ पायथन पैकेज वास्तव में ऐसा करते हैं। एक उदाहरण JSON के साथ है , जहां रनिंग import json
वास्तव __init__.py
में json
पैकेज से आयात हो रहा है ( पैकेज फ़ाइल संरचना यहां देखें ):
सोर्स कोड:
Lib/json/__init__.py
__init__.py
निर्देशिका का इलाज यह एक लोड करने योग्य मॉड्यूल के रूप में होगा।
जो लोग कोड पढ़ना पसंद करते हैं, उनके लिए मैंने टू-बिट अल्केमिस्ट की टिप्पणी यहां दी है।
$ find /tmp/mydir/
/tmp/mydir/
/tmp/mydir//spam
/tmp/mydir//spam/__init__.py
/tmp/mydir//spam/module.py
$ cd ~
$ python
>>> import sys
>>> sys.path.insert(0, '/tmp/mydir')
>>> from spam import module
>>> module.myfun(3)
9
>>> exit()
$
$ rm /tmp/mydir/spam/__init__.py*
$
$ python
>>> import sys
>>> sys.path.insert(0, '/tmp/mydir')
>>> from spam import module
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named spam
>>>
यह अन्य अजगर फ़ाइलों को आयात करने की सुविधा देता है। जब आपने इस फाइल को एक निर्देशिका (सामान कहो) में रखा, जिसमें अन्य py फाइलें थीं, तब आप कुछ चीजें आयात कर सकते हैं।
root\
stuff\
other.py
morestuff\
another.py
__init__.py
निर्देशिका सामान के अंदर इसके बिना , आप अन्य थिंक को आयात नहीं कर सकते, क्योंकि पायथन को नहीं पता है कि सामान के लिए स्रोत कोड कहां है और इसे पैकेज के रूप में पहचानने में असमर्थ है।
एक __init__.py
फ़ाइल आयात को आसान बनाती है। जब कोई __init__.py
पैकेज के भीतर मौजूद होता है, तो फ़ंक्शन a()
को फ़ाइल से आयात किया जा सकता है b.py
जैसे:
from b import a
इसके बिना, हालांकि, आप सीधे आयात नहीं कर सकते। आपको सिस्टम पथ में संशोधन करना होगा:
import sys
sys.path.insert(0, 'path/to/b.py')
from b import a