Ситуация: - В моей папке project_folder есть модуль под названием calendar - Я хотел бы использовать встроенный класс Calendar из библиотек Python - Когда я использую календарь импорта из календаря, он жалуется, потому что пытается загрузить из моего модуля.
Я провел несколько поисков и не могу найти решение своей проблемы.
- Как получить доступ к модулю стандартной библиотеки в Python, если есть локальный модуль с таким же именем?
- http://docs.python.org/whatsnew/2.5.html
- Как не писать все время имя модуля при импорте модуля в Python?
Есть идеи без переименования моего модуля?
Ответы:
Принятое решение содержит устаревший подход.
Документация importlib здесь дает хороший пример более подходящего способа загрузки модуля непосредственно из пути к файлу для python> = 3.5:
Таким образом, вы можете загрузить любой файл .py по пути и установить любое имя модуля. Так что просто измените его так,
module_name
чтобы оно было любым пользовательским именем, которое вы хотите, чтобы модуль имел при импорте.Чтобы загрузить пакет вместо одного файла,
file_path
должен быть путь к корню пакета__init__.py
источник
file_path=r"C:\Users\My User\My Path\Module File.py"
. Затем я позвонилmodule_name
точно так же, как выпущенный модуль, чтобы у меня был полностью рабочий сценарий, который, без этого фрагмента, можно было бы использовать на других компьютерахМенять имя вашего модуля не нужно. Скорее, вы можете использовать absolute_import для изменения поведения импорта. Например, с помощью stem / socket.py я импортирую модуль сокета следующим образом:
Это работает только с Python 2.5 и выше; это активирующее поведение, используемое по умолчанию в Python 3.0 и выше. Pylint будет жаловаться на код, но он абсолютно верен.
источник
PYTHONPATH
. Другой вопрос показывает, как это решить.На самом деле решить эту проблему довольно просто, но реализация всегда будет немного хрупкой, потому что это зависит от внутренних компонентов механизма импорта Python, и они могут быть изменены в будущих версиях.
(следующий код показывает, как загружать локальные и нелокальные модули и как они могут сосуществовать)
Лучшее решение, если возможно, - избегать именования ваших модулей с тем же именем, что и имена стандартной библиотеки или встроенных модулей.
источник
sys.modules
последующими попытками загрузки локального модуля?Единственный способ решить эту проблему - самостоятельно угнать внутреннюю импортную технику. Это непросто и чревато опасностями. Вы должны избегать маяка в форме Грааля любой ценой, потому что опасность слишком велика.
Вместо этого переименуйте свой модуль.
Если вы хотите узнать, как взломать механизм внутреннего импорта, вот где вы должны узнать, как это сделать:
Иногда есть веские причины попасть в такую опасность. Причины, по которой вы говорите, среди них нет. Переименуйте свой модуль.
Если вы выберете опасный путь, одна проблема, с которой вы столкнетесь, заключается в том, что когда вы загружаете модуль, он получает «официальное имя», так что Python может никогда больше не анализировать содержимое этого модуля. Сопоставление «официального имени» модуля с самим объектом модуля можно найти в
sys.modules
.Это означает, что если вы находитесь
import calendar
в одном месте, любой импортированный модуль будет рассматриваться как модуль с официальным именем,calendar
и все другие попыткиimport calendar
куда-либо еще, в том числе в другом коде, который является частью основной библиотеки Python, получат этот календарь.Можно было бы разработать клиентский импортер, используя модуль imputil в Python 2.x, который заставлял бы модули, загружаемые с определенных путей, искать модули, которые они импортируют, не в
sys.modules
первом или чем-то подобном. Но делать это крайне непросто, и в любом случае это не сработает в Python 3.x.Вы можете сделать очень уродливую и ужасную вещь, которая не требует подключения механизма импорта. Вероятно, вам не стоит этого делать, но, скорее всего, это сработает. Он превращает ваш
calendar
модуль в гибрид модуля системного календаря и модуля календаря. Спасибо Boaz Yaniv за скелет функции, которую я использую . Поместите это в начало вашегоcalendar.py
файла:источник
code
модуль Python std), а это означает, что только часть разработчиков может иметь какие-либо проблемы с этим «хаком слияния». Пользователи не пострадают.Хочу предложить свою версию, которая представляет собой комбинацию решения Боаза Янива и Omnifarious. Он импортирует системную версию модуля с двумя основными отличиями от предыдущих ответов:
Поместите это где-нибудь под рукой, чтобы вы могли его вызвать (у меня есть мой в моем файле __init__.py):
пример
Я хотел импортировать mysql.connection, но у меня уже был локальный пакет с именем mysql (официальные утилиты mysql). Итак, чтобы получить коннектор из системного пакета mysql, я заменил это:
С этим:
результат
источник
Измените путь импорта:
источник
sys.modules
и больше не импортирует модуль с тем же именем.