В основном у меня есть подпакет с тем же именем как стандартный пакет библиотеки ("вход"), и я хотел бы, чтобы это смогло к абсолютному импорту стандартный, неважно, как я выполняю его, но это перестало работать, когда я нахожусь в родительском пакете.
Это действительно похоже или на ошибку или на недокументированное поведение нового "абсолютного импорта" поддержка (новый с Python 2.5). Попробованный 2,5 и 2.6.
Макет раскладки:
foo/
__init__.py
logging/
__init__.py
В foo/__init__.py
мы импортируем наш собственный подпакет входа:
from __future__ import absolute_import
from . import logging as rel_logging
print 'top, relative:', rel_logging
В foo/logging/__init__.py
мы хотим импортировать stdlib logging
пакет:
from __future__ import absolute_import
print 'sub, name:', __name__
import logging as abs_logging
print 'sub, absolute:', abs_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'>
Двойной вывод для "sub, имя" показывает, что мой собственный подпакет звонил, "вход" импортирует себя во второй раз, и это не находит stdlib "регистрирующимся" пакетом даже при том, что "absolute_import" включен.
Вариант использования - то, что я хотел бы смочь работать с, тест, и т.д., этот пакет независимо от того, каков текущий каталог. Менять имя от "входа" до чего-то еще было бы обходным решением, но не желательным, и в любом случае это поведение, кажется, не соответствует описанию того, как должен работать абсолютный импорт.
Какие-либо идеи, что продолжается, является ли это ошибкой (мой или Python), или подразумевается ли это поведение на самом деле некоторой документацией?
Править: ответ gahooa показывает ясно, какова проблема. Сырое обходное решение, которое доказывает вот именно, показывают здесь:
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]
по умолчанию ''
, что означает "текущий каталог". Так что если вы сидите в каталоге с log
, то это будет выбрано первым.
Я столкнулся с этим недавно, пока не понял, что на самом деле сижу в этом каталоге и что sys.path
выбирает мой текущий каталог ПЕРВЫЙ, перед тем как искать в стандартной библиотеке.