2009-12-24 8 views
8

असल में मेरे पास एक मानक लाइब्रेरी पैकेज ("लॉगिंग") के समान नाम के साथ एक उप-पैकेज है और मैं इसे मानक एक को पूर्ण रूप से आयात करने में सक्षम होना चाहता हूं इससे कोई फर्क नहीं पड़ता कि मैं इसे कैसे चलाता हूं, लेकिन जब मैं मूल पैकेज में हूं तो यह विफल हो जाता है।उप-पैकेज में निरपेक्ष आयात विफल रहता है जो 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'> 

उत्तर

10

sys.path[0] डिफ़ॉल्ट '' है, जो "वर्तमान निर्देशिका" का अर्थ है कर रहा है। तो यदि आप logging के साथ निर्देशिका में बैठे हैं, तो पहले इसे चुना जाएगा।

मैं हाल ही में इसमें भाग गया, जब तक मुझे एहसास हुआ कि मैं वास्तव में उस निर्देशिका में बैठा था और sys.path मानक पुस्तकालय में देखने से पहले, मेरी वर्तमान निर्देशिका को उठा रहा था।

+0

धन्यवाद। मैंने बस इतना ही महसूस किया था क्योंकि मैंने इसे दोपहर के भोजन पर अधिक सोचा था।मुझे लगता है कि यह अनिवार्य है कि यह तब तक होगा जब तक आप जानबूझकर sys.path [0] को हटा दें या 'अंत' या कुछ '' पर जाएं। मैं ध्यान दूंगा कि मेरे प्रश्न में। –

संबंधित मुद्दे