Python - вложенный файл в одном каталоге, импортирующий вложенный файл в другом каталоге - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь запустить проект Python3, и у меня возникают проблемы с пониманием того, как настроить каталог проекта, чтобы я мог импортировать модули и повторно использовать код. Я уже исследовал бесчисленные примеры переполнения стека и поисков в Google, но, кажется, ничто не объясняет это ясно (или, может быть, я просто не правильно понимаю).

Допустим, у меня есть следующий каталог проекта:

+my_project
|----src
|     |---- calculate.py
|     |---- distribute.py
|
|----helpers
|     |---- calculate_helpers.py
|     |---- distribute_helpers.py
|
|----main.py

Учитывая приведенный выше каталог проекта, допустим, у меня есть 3 сценария ios:

  1. В моем src/calculate.py я хочу использовать метод, определенный в helpers/calculate_helpers.py. Я попытался импортировать файл через import helpers.calculate_helpers и from helpers.calculate_helpers import calculate_task. Однако я всегда получаю ошибку Module not found.

  2. В моем helpers/calculate_helpers.py я хочу использовать метод, определенный в helpers/distribute.py. На этот раз я, кажется, могу import distribute и затем получить доступ к методам, определенным в этом модуле.

  3. В моем main.py я хочу использовать метод, определенный в src/distribute.py. Если у меня просто есть import src.distribute, это не будет работать, но если я добавлю __init__.py файл в каталог src, то import src.distribute будет работать. Насколько я понимаю из чтения документов , __init__.py файлы больше не нужны, но я могу ошибаться.

Можете ли вы помочь мне понять, почему (1 ) и (3) не работают, почему (2) работает, и как лучше всего Python импортировать модули из разных вложенных каталогов?

1 Ответ

1 голос
/ 25 марта 2020

Попробуйте эти документы: https://docs.python.org/3/tutorial/modules.html#packages

Чтобы использовать calculate_helpers, внутри calculate.py:

  1. добавить пустое __init__.py в src/ и еще один в helpers/ (эффективно конвертируя их обоих в пакеты

  2. внутри вашего calculate.py:

from helpers import calculate_helpers

def some_fun():   
    calculate_helpers.some_helper() 

РЕДАКТИРОВАТЬ 1: - Я не использовал пакетов пространства имен , но, возможно, это руководство с примерами поможет прояснить ваш третий пункт

...