Абсолютный импорт, переставший работать в подпакете, что тени stdlib имя пакета

В основном у меня есть подпакет с тем же именем как стандартный пакет библиотеки ("вход"), и я хотел бы, чтобы это смогло к абсолютному импорту стандартный, неважно, как я выполняю его, но это перестало работать, когда я нахожусь в родительском пакете.

Это действительно похоже или на ошибку или на недокументированное поведение нового "абсолютного импорта" поддержка (новый с 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'>
8
задан Peter Hansen 24 December 2009 в 18:05
поделиться

1 ответ

sys.path[0] по умолчанию '', что означает "текущий каталог". Так что если вы сидите в каталоге с log, то это будет выбрано первым.

Я столкнулся с этим недавно, пока не понял, что на самом деле сижу в этом каталоге и что sys.path выбирает мой текущий каталог ПЕРВЫЙ, перед тем как искать в стандартной библиотеке.

.
10
ответ дан 5 December 2019 в 17:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: