подпапки модулей Python недоступны после импорта - PullRequest
0 голосов
/ 19 сентября 2018

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

Структура выглядит следующим образом

mylib
    __init__.py
    area1
        __init__.py
        group11.py
    area2
        __init__.py
        group12.py

Файлы __init__.py содержат только переменную __all__.Один верхний уровень - __all__ = ["area1", "area2"], остальные похожи на __all__ = ["group11"] Предположим, что group11.py содержит функцию def test():, которую я хочу вызвать.

После установки пакета у меня получаются следующие результаты

import mylib # --> ok
mylib.area1.group11.test() # --> module 'mylib' has no attribute 'area1'

import mylib.area1.group # --> ok
mylib.area1.group11.test() # --> ok

from mylib.area1 import group11 # --> ok
group11.test() # --> ok

Почему первое решение не работает?Должен ли я что-то добавить в __all__ файлы?

1 Ответ

0 голосов
/ 19 сентября 2018

Это совершенно нормально.Вы не определяете символ area1 в своем пакете mylib, поэтому возникает ошибка.

Опция 1

Одним из решений будет экспорт всех символов из вашего подпакета.следующим образом:

from . import area1

Вариант 2

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

# mylib/area1/group11.py

def test():
   print 'hello'
# mylib/__init__.py

from area1.group11 import test
import mylib
mylib.test() # OK

import mylib.area1.group11
mylib.area1.group11.test() # OK

Однако, поскольку ваш символ test определен в mylib.area1.group11, вы не сможете только импортировать mylib для доступа к подпакетам и модулям в них..

Я пытаюсь сказать, что когда вы делаете import mylib, вы импортируете символы, определенные в mylib/__init__.py, а не подпакеты или подмодули.Вы также должны импортировать их.

Предупреждение : вам придется сделать то же самое в mylib/area1/__init__.py и mylib/area2/__init__.py, если вы хотите «экспортировать» / определить символы из mylib/area1/group11.py

Для получения более подробной информации:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...