@Dzhigit
Начинающий прогер

Как пользоваться видимость пакетов Python?

Решил рассортировать сове приложение по пакетам, но возникла 1 проблема.
Допустим есть исполняемый файл main.py
Пакет с дополнениями test (file_1, file_2, __init__)
Внутри пакета с дополнениями есть еще 1 пакет с утилитами т.е. test/utils (utils, __init__)

Так вот:
.
└── src/
        ├── main.py
        └── test/
                └── __init__.py
                └── file_1.py
                └── file_2.py
                └── utils/
                        └── __init__.py
                        └── utils.py


В __init__ test импорт файлов 1 и 2 и всего его содержимого (*)
В __init__ utils импорт utils.py и всего его содержимого

file_2 будет использовать, чтото из первого, и естественно импортировать utils пакет

main импортирует file_2 из модуля test и получает ошибку (ModuleNotFoundError: No module named 'utils'), а в file_2 все хорошо работает.

Буду очень признателен, если объясните проблему. И как можно избежать данной ошибки.
  • Вопрос задан
  • 191 просмотр
Пригласить эксперта
Ответы на вопрос 1
shurshur
@shurshur
Сисадмин, просто сисадмин...
Импорт модуля - это не вставка его кода в вызывающий модуль. Если сделать

import XXX

или

import YYY as XXX

то в текущей области видимости появится XXX, через который можно будет обращаться к содержимому другого модуля. В частности, можно обращаться к модулям, импортированным в нём:

import YYY as XXX
print (XXX.sys.argv)


Чтобы получить всё, что есть в модуле XXX, в текущей области видимости, можно сделать так:

from XXX import *

Но так импортируется реально всё, в том числе модули, которые импортированы в XXX. Но это можно обойти, если внутри XXX в переменной __all__ описать list со всеми именами, которые должны импортироваться при таком импорте. По умолчанию импортируется всё.
Ответ написан
Ваш ответ на вопрос

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

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