Подмодуль импорта лучших практик Python в подмодуле - PullRequest
0 голосов
/ 11 декабря 2018

В настоящее время я читаю о субмодуле Python в импорте субмодулей и почему-то не могу найти правильный ответ.Вот пример:

root/
     main.py
     moduleA/
             __init__.py
             log.py
     moduleB/
             __init__.py
             worker.py

Я хотел бы импортировать log в worker, используя import moduleA.log.И я хотел бы импортировать worker в main и использовать его там.

Пока что я нашел следующие решения:

  • Добавить sys.path с помощью ../ (sys.path.append('../'))
  • Я читал кое-что об использовании pip -e для установки моего модуля в среду
  • Как избежать сценариев, которые импортируются из подмодулей

IЧитал, что взлом sys.path считается лучшей практикой.Но почему-то это не так.

Так что я хотел бы знать, что вы считаете лучшей практикой.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

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

С вашей структурой:

root/
     __init__.py
     root.py
     modulea/
         __init__.py
         a.py
      moduleb/
         __init__.py
         b.py

root.py будетбыть:

from modulea.a import sleep, eat, breath
from moduleb.b import read, write, watch

так, чтобы я мог потом сделать

from package.root import sleep, read, watch

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

0 голосов
/ 11 декабря 2018

Лично я предпочитаю изменить свой текущий рабочий каталог и импортировать на всякий случай, если я когда-нибудь столкнусь с этой проблемой.

root/
     __init__.py
     root.py
     modulea/
             __init__.py
             a.py
     moduleb/
             __init__.py
             b.py

При такой настройке,

a.py
def a():
    print("i am a")

И в b просто измените текущий каталог на корневой с использованием абсолютного или относительного пути через os.chdir

b.py

def b():
    print("i am b")

import os
os.chdir('..')
from modulea.a import a
a()

Запуск печати b.py i am a

Существуют и другие варианты, sys.path или PYTHONPATH. См. Здесь

Однако я также рекомендую избегать таких сценариев, насколько это возможно.

...