असल में मेरे पास एक मानक लाइब्रेरी पैकेज ("लॉगिंग") के समान नाम के साथ एक उप-पैकेज है और मैं इसे मानक एक को पूर्ण रूप से आयात करने में सक्षम होना चाहता हूं इससे कोई फर्क नहीं पड़ता कि मैं इसे कैसे चलाता हूं, लेकिन जब मैं मूल पैकेज में हूं तो यह विफल हो जाता है।उप-पैकेज में निरपेक्ष आयात विफल रहता है जो stdlib पैकेज नाम छाया करता है
यह वास्तव में या तो एक बग, या नए "पूर्ण आयात" समर्थन (पायथन 2.5 के रूप में नया) का अनियंत्रित व्यवहार जैसा दिखता है। 2.5 और 2.6 के साथ कोशिश की।
पैकेज लेआउट:
foo/
__init__.py
logging/
__init__.py
foo/__init__.py
में हम अपने ही प्रवेश सबपैकेज आयात:
from __future__ import absolute_import
print 'sub, name:', __name__
import logging as abs_logging
print 'sub, absolute:', abs_logging
नोट:
from __future__ import absolute_import
from . import logging as rel_logging
print 'top, relative:', rel_logging
foo/logging/__init__.py
हम stdlib logging
पैकेज आयात करना चाहते हैं :foo
युक्त फ़ोल्डर sys.path में है।
जब foo
ऊपर बाहर/से आयात, उत्पादन की उम्मीद के रूप में किया जाता है:
c:\> python -c "import foo"
sub, name: foo.logging
sub, absolute: <module 'logging' from 'c:\python26\lib\logging\__init__.pyc'>
top, relative: <module 'foo.logging' from 'foo\logging\__init__.pyc'>
तो सबपैकेज में पूर्ण आयात के रूप में वांछित stdlib पैकेज पाता है।
लेकिन जब हम foo
फ़ोल्डर के अंदर कर रहे हैं, इसे दूसरे तरीके से बर्ताव करता है:
c:\foo>\python25\python -c "import foo"
sub, name: foo.logging
sub, name: logging
sub, absolute: <module 'logging' from 'logging\__init__.pyc'>
sub, absolute: <module 'logging' from 'logging\__init__.pyc'>
top, relative: <module 'foo.logging' from 'c:\foo\logging\__init__.pyc'>
"उप, नाम" के लिए डबल उत्पादन पता चलता है कि अपने ही सबपैकेज "प्रवेश" कहा जाता है अपने आप में एक दूसरी बार आयात कर रहा है, और यह stdlib "लॉगिंग" पैकेज नहीं मिला है, भले ही "absolute_import" सक्षम है।
उपयोग का मामला यह है कि मैं इस निर्देशिका के साथ काम करने में सक्षम होना चाहता हूं, इस निर्देशिका के बावजूद कि वर्तमान निर्देशिका क्या है। किसी अन्य चीज़ पर "लॉगिंग" से नाम बदलना एक कामकाज होगा, लेकिन एक वांछनीय नहीं होगा, और किसी भी मामले में यह व्यवहार इस बात के अनुरूप फिट नहीं लगता है कि पूर्ण आयात कैसे काम करना चाहिए।
कोई विचार क्या हो रहा है, चाहे यह एक बग (मेरा या पायथन) है, या क्या यह व्यवहार वास्तव में कुछ दस्तावेज द्वारा निहित है?
संपादित करें: गहुआ द्वारा उत्तर स्पष्ट रूप से समस्या दिखाता है। एक कच्चे काम के आसपास है कि साबित होता है यह यहाँ दिखाया गया है है:
c:\foo>python -c "import sys; del sys.path[0]; import foo"
sub, name: foo.logging
sub, absolute: <module 'logging' from 'c:\python26\lib\logging\__init__.pyc'>
top, relative: <module 'foo.logging' from 'c:\foo\logging\__init__.pyc'>
धन्यवाद। मैंने बस इतना ही महसूस किया था क्योंकि मैंने इसे दोपहर के भोजन पर अधिक सोचा था।मुझे लगता है कि यह अनिवार्य है कि यह तब तक होगा जब तक आप जानबूझकर sys.path [0] को हटा दें या 'अंत' या कुछ '' पर जाएं। मैं ध्यान दूंगा कि मेरे प्रश्न में। –