Проблема заключается в том, что текущий рабочий каталог (или как ''
или '.'
, в зависимости от версии/платформы) всегда в верхней части sys.path
при запуске Python.
Использование абсолютного импорта не имеет значения - это просто означает посмотреть в sys.path
сначала, вместо того, чтобы искать относительный импорт, прежде чем вернуться на sys.path
.
Правильное решение, очевидно, заключается в том, чтобы либо (a) переименовать calendar
, либо (b) переместить его в подпакет другого пакета вместо того, чтобы иметь его на верхнем уровне. Независимо от ваших хороших причин, хорошие причины для правильной работы, вероятно, еще лучше.
Но если вам нужно обойти это, вы можете сделать несколько вещей. Проще всего временно munge sys.path
:
syspath = sys.path
sys.path = [path for path in sys.path if path.strip('.')]
import calendar
sys.path = syspath
Однако, независимо от того, что вы делаете, это не будет вызывать огромные проблемы. Когда вы позже попытаетесь импортировать свой локальный пакет calendar
- даже если вы делаете это из совершенно другого исходного файла - ничего не произойдет, потому что уже есть что-то с именем calendar
в sys.modules
, так что другой исходный файл просто получит модуль stdlib calendar
вместо вашего пакета.
Так что вам также нужно будет переименовать один или другой на лету и удалить его с sys.modules
. Может быть, это:
syspath = sys.path
sys.path = [path for path in sys.path if path.strip('.')]
calmod = sys.modules.get('calendar')
del sys.modules['calendar']
calendar = __import__('calendar')
sys.modules['calendar'] = calmod
sys.path = syspath
И, в зависимости от того, на котором ваши модули задавят (которые не могут быть легко предсказуемы, или даже детерминированный), есть хороший шанс, что вы будете нуждаться в подобную повозка, запряженная волами в другом месте.
(Что делать, если вы никогда не должны импортировать локальный пакет calendar
? Ну, в таком случае у вас нет этой проблемы ... но тогда я не могу себе представить, что ваши веские причины могли бы быть ...)
Вы можете «импортировать sys' и переупорядочить' sys.path' самостоятельно. Однако, если вы говорите, что на самом деле у вас есть каталог на 'sys.path', который имеет пакет/модуль с именем так же, как встроенный (т. Е. Ваш« календарь »находится на верхнем уровне пути), вы действительно нужно переименовать его (на самом деле есть даже лучшие причины). Нет общего способа разрешения конфликтов имен верхнего уровня. – BrenBarn
Возможный дубликат: http://stackoverflow.com/questions/6031584/python-importing-from-builtin-library-when-module-with-same-name-exists –