Python импортирует только модули внутри пакета

Я создаю пакет Python с несколькими модулями. Я хочу убедиться, что когда я импортирую модули в пакете, они импортируют только из пакета, а не что-то вне пакета с тем же именем.

Правильный ли способ сделать это - использовать относительный импорт? Будет ли это мешать, когда я перевожу свой пакет в другое место на моем компьютере (или устанавливается где-либо на компьютере клиента)?

2 ответа

Решение

Современный относительный импорт ( здесь ссылка) является относительным к пакету и специфичным для пакета, поэтому, пока внутренняя структура вашего пакета не изменяется, вы можете перемещать пакет в целом куда угодно.

Хотя ответ Джорана Бизли также должен сработать (хотя в старых версиях Python, где абсолютный импорт не используется по умолчанию, в этом нет необходимости, поскольку старый стиль импорта сначала проверяется в каталоге пакета), лично мне это не очень нравится. измените путь импорта, когда вам это не нужно, особенно если вам нужно загрузить некоторые из тех других пакетов или модулей, которые ваши модули или пакеты теперь затеняют.

Предупреждение, однако: для этого требуется, чтобы рассматриваемый модуль был загружен как часть пакета или, по крайней мере, имел свои __name__ установить, чтобы указать местоположение в пакете. Относительный импорт не будет работать для модуля, когда __name__ == '__main__', так что если вы пишете простой / случайный скрипт, который использует другой модуль в том же каталоге, что и он (и хотите убедиться, что скрипт будет ссылаться на правильный каталог, то все будет работать неправильно, если текущий рабочий каталог не установить в сценарии), вы могли бы сделать что-то вроде import os, sys; sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) (спасибо /questions/39906758/python-izmenit-rabochij-katalog-skriptov-na-sobstvennyij-katalog-skripta/39906779#39906779 за идею). Как отмечалось в ответе С. Лотта на тот же вопрос, это, вероятно, не то, что вы хотели бы сделать профессионально или как часть командного проекта, а что-то личное, когда вы просто выполняете некоторую автоматизацию для выполнения черных задач или тому подобное. это должно быть хорошо.

sys.path говорит Python, где искать импорт

добавлять

import sys
sys.path.insert(0,".")

в начало вашего основного скрипта Python это будет гарантировать, что локальные пакеты будут импортированы ДО встроенных пакетов (хотя я думаю, что это происходит автоматически)

если вы действительно хотите импортировать только пакеты в вашей папке, сделайте

import sys
sys.path = ["."]

однако я не рекомендую это вообще, поскольку это вероятно сломает много Ваших вещей...

большинство IDE (eclipse/pycharm/etc) предоставляют механизмы для настройки среды, используемой проектом, включая его пути

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

также лучшим вариантом является распространение его через правильно упакованный пакет, этого должно быть более чем достаточно

Другие вопросы по тегам