Простейшая python структура проекта, позволяющая скриптам ссылаться на пакеты и модули внутри проекта - PullRequest
0 голосов
/ 13 марта 2020

У меня настроен проект python, в котором мои сценарии хранятся в одной папке, а мои пакеты и данные - в других папках, и я пытаюсь организовать наилучшую структуру и процедуры для повышения надежности ссылок между этими элементами.

Основное использование этой программы - обработка некоторых файлов данных и выдача результатов для включения в отчеты. Мне не нужно помещать это в пакет PyPI или использовать в производстве. Я просто хочу, чтобы этот репозиторий легко использовался любым коллегой, который клонирует его и запускает команды make.

project_dir/
    data/
        raw/
            source_1.csv
            source_2.csv
        processed/
            tidydata.csv
            results.csv
    src/
        scripts/
            clean_raw_data.py
            calc_results.py
        modules/
            tool_a.py
            tool_b.py
            tool_c.py
    Makefile

Если я запускаю сценарий в PyCharm, я могу заставить его работать правильно, потому что IDE позволяет установить папку проекта root в вашем пути. Тем не менее, как только я начинаю пытаться выполнять операции командной строки (например, внутри Makefile), я не могу позволить себе такую ​​роскошь.

Мое желание - иметь возможность надежно ссылаться на мои пакеты посредством импорта (./src/packages) и мои данные (./data) с операциями чтения и записи файлов из любого из моих сценариев в папке ./src/scripts.

Моя текущая настройка включает в себя следующие действия:

Чтобы импортировать пакеты в мои скрипты, я делаю это, что мне не нравится, и я знаю, что это плохая опция:

# clean_raw_data.py
import sys
from pathlib import Path
sys.path.append(str(Path(__file__).parent.parent))
import packages.import_tools as imptool

Для чтения и записи файлов (также плохо):

import pandas as pd
df = pd.read_csv('../../data/raw/source_1.csv')
# operations
df.to_csv('../../data/processed/tidydata.csv')

В идеале я бы предпочел, чтобы все было доступно по ссылке из папки проекта project_dir в любом файле или скрипте в моей структуре, так что я мог бы делать что-то вроде:

import src.modules as mods
df = pd.read_csv(f'{ROOT_DIR}/data/raw/source_1.csv')

Так или иначе , Я полагаю, что существует рекомендация по оптимальной настройке для поведения, которое ведет себя подобным образом, но не было никаких хороших рекомендаций. Каков наилучший подход для решения этой проблемы? У меня была мысль переместить мои скрипты в папку над модулями, что позволило бы мне легко делать такие вещи, как import modules.tool_a as ta, но я бы предпочел не иметь грязной папки scripts с скрытой директорией modules (кажется тоже плохо).

project_dir/
    data/
        raw/
            source_1.csv
            source_2.csv
        processed/
            tidydata.csv
            results.csv
    src/
        scripts/
            clean_raw_data.py
            calc_results.py
            modules/
                tool_a.py
                tool_b.py
                tool_c.py
    Makefile

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

...