@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 все хорошо работает.

Буду очень признателен, если объясните проблему. И как можно избежать данной ошибки.
  • Вопрос задан
  • 215 просмотров
Пригласить эксперта
Ответы на вопрос 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 со всеми именами, которые должны импортироваться при таком импорте. По умолчанию импортируется всё.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы