@J_K

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

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

1) Почему во Flask даже если я обращаюсь к вложенным модулям, наименование модуля все равно идет от корня?
Например, в корне лежит файл start.py, из которого я вызываю функцию, находящуюся в logic/mylogic.py. Также в папке logic лежит еще папка, а в ней какие-нибудь мои модули, например a.py. Относительно mylogic.py можно было бы сделать import a, но работает только import logic.a, даже если вызов идет из mylogic.py, который уже лежит в папке logic.

2) Если в интернете, на гитхабе, например, мне попадается какая-нибудь либа или чей-либо код, и я хочу его использовать, а этот код внутри ссылается на свои внутренние же модули, то мне приходится класть его только в корень. Стоит мне перенести его в какую-нибудь другую вложенную папку, как внутренние модули перестают работать, так как все их импорты опять же идут от корня (та же проблема, что и в предыдущем вопросе). Можно конечно, было бы переименовать все импорты, но в некоторых случаях (например, некоторые примеры tensoflow насчитывают тысячи и больше файлов) это дико неудобно, может быть, сущетсвует какой-то нормальный способ избежать зависимости от конкретной папки, где лежит модуль?
Спасибо!
  • Вопрос задан
  • 5142 просмотра
Пригласить эксперта
Ответы на вопрос 2
sanya84
@sanya84
Фанатик Python 3
В папке где лежит импортируемый модуль, надо создать пустой модуль __init__.py
Ну естественно если много под-папок то в каждой надо создать
Внутри папок делается относительный импорт
from . import my_module
Ответ написан
@immaculate
Программист-путешественник
Если в интернете, на гитхабе, например, мне попадается какая-нибудь либа или чей-либо код, и я хочу его использовать, а этот код внутри ссылается на свои внутренние же модули, то мне приходится класть его только в корень. Стоит мне перенести его в какую-нибудь другую вложенную папку, как внутренние модули перестают работать, так как все их импорты опять же идут от корня (та же проблема, что и в предыдущем вопросе). Можно конечно, было бы переименовать все импорты, но в некоторых случаях (например, некоторые примеры tensoflow насчитывают тысячи и больше файлов) это дико неудобно, может быть, сущетсвует какой-то нормальный способ избежать зависимости от конкретной папки, где лежит модуль?


Никуда чужой код класть не надо. Надо использовать virtualenv (pipenv, conda, poetry) и устанавливать чужой код командой pip install tensorflow. Так же и со всеми остальными библиотеками.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы