Модуль принудительного импорта из стандартной библиотеки Python вместо PYTHONPATH по умолчанию

У меня есть пользовательский модуль в одном из каталогов в моем PYTHONPATH с тем же именем, что и у одного из модулей стандартной библиотеки, поэтому, когда я import module_name, этот модуль загружается. Если я хочу использовать исходный модуль стандартной библиотеки, есть ли способ заставить Python импортировать из стандартной библиотеки, а не из каталога PYTHONPATH, если не считать переименования пользовательского модуля и изменения каждой ссылки, чтобы она указывала на новое имя?


person jrdioko    schedule 01.06.2010    source источник
comment
Что плохого в переименовании модуля?   -  person S.Lott    schedule 01.06.2010
comment
Это просто потребует внесения изменений в десятки файлов. Хотя, похоже, это лучшее решение.   -  person jrdioko    schedule 01.06.2010
comment
У вас есть grep, так что не должно быть слишком сложно найти каждый из них и исправить их.   -  person S.Lott    schedule 02.06.2010
comment
Пожалуйста, также добавьте к уравнению, что в вашей программе может быть модуль, который в более поздней версии конфликтует с новым стандартным модулем. Имея это в виду, я думаю, что это правильный вопрос для написания кода, подтверждающего будущее.   -  person Deleted    schedule 23.04.2012
comment
@CristianCiupitu: модули в PYTHONPATH не локальны. Абсолютный импорт здесь не поможет. Не затеняйте модули stdlib, иначе вы сломаете любой код, который не ожидает вашего пользовательского модуля. Если вам нужно, вы можете переместить соответствующий каталог в начало списка sys.path в файле *.pth или в своем коде, но правильным решением будет переименовать модуль как предложил @S.Lott, например, поместите его в свое собственное пространство имен: import jrdioko.module_name as module_name.   -  person jfs    schedule 22.03.2015
comment
@ J.F.Sebastian, мне кажется, ты отвечаешь не тому парню. Все, что я говорил, это то, что этот вопрос является дубликатом другого.   -  person Cristian Ciupitu    schedule 22.03.2015
comment
@CristianCiupitu мой комментарий объясняет, почему вопрос не является дубликатом.   -  person jfs    schedule 22.03.2015
comment
@ J.F.Sebastian, но у них один и тот же принятый ответ. Если вы думаете, что у вас есть лучший ответ, почему бы не добавить его к одному из вопросов?   -  person Cristian Ciupitu    schedule 23.03.2015
comment
@CristianCiupitu: да. Часть об абсолютном импорте в текущем принятом ответе неверна. Это будет не первый принятый ответ, который неверен. Я видел неправильные принятые ответы с более чем 100 голосами. Мой ответ: переименовать модуль, который уже указан в принятом ответе.   -  person jfs    schedule 23.03.2015


Ответы (3)


Идеальным решением было бы переименовать ваш модуль во что-то, чего нет в стандартной библиотеке.

Вы также можете включить абсолютный импорт. если вы используете Python 2.5+:

from __future__ import absolute_import
person Luper Rouch    schedule 01.06.2010
comment
Как мне использовать относительный импорт, чтобы получить стандартную версию библиотеки? - person jrdioko; 01.06.2010
comment
абсолютный импорт не поможет вам, если у вас есть модуль в PYTHONPATH, который скрывает модуль stdlib. - person jfs; 23.03.2015

Не надо.

Если вы случайно выбрали стандартное имя модуля библиотеки, измените имя модуля, чтобы прекратить конфликт.

person S.Lott    schedule 01.06.2010
comment
Это, вероятно, лучшее решение, как для того, чтобы не вызывать путаницы у посещающих программистов, так и для того факта, что поведение при импорте модуля, который еще не был относительным импортом, не изменится при включенном абсолютном импорте. - person Matt Joiner; 18.03.2011
comment
Это очевидный ответ, но меня немного раздражает, что стандартной библиотеке разрешено использовать пространство имен таким образом по соглашению. Это огромная! И он содержит много общих слов, связанных с кодом, таких как оба типа и типизация. И он все время растет. - person mszegedy; 09.06.2019

Вы можете выбрать модуль, который хотите импортировать, с помощью модуля imp:

import imp
mymodule = imp.load_module(name, file, pathname, description) 
person joaquin    schedule 01.06.2010