Структурирование проекта Python, позволяющее сценариям импортировать локальные пакеты, ссылаясь относительно каталога проекта root - PullRequest
1 голос
/ 07 марта 2020

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

project_dir/
    data/
        raw/
            source_1.csv
            source_2.csv
        processed/
            tidydata.csv
            results.csv
    src/
        scripts/
            clean_raw_data.py
            calc_results.py
        packages/
            import_tools
                tool_a.py
                tool_b.py
            calc_tools
    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.packages.import_tools as imptool
df = pd.read_csv(f'{ROOT_DIR}/data/raw/source_1.csv')

Так или иначе. Я полагаю, что существует рекомендация по оптимальной настройке для поведения, которое ведет себя подобным образом, но не было никаких хороших рекомендаций. Как лучше всего справиться с этим?

1 Ответ

1 голос
/ 12 апреля 2020

В Python механизмы ссылки на файлы данных и исходный код совершенно разные. Хотя вам всегда нужно указывать полный путь к файлу данных, когда вы хотите его открыть, Python будет использовать sys.path для автономного поиска модулей, которые вы хотите импортировать. Однако «взломать» sys.path вручную во всех ваших файлах скриптов - плохая практика. Вместо этого используйте pip для установки проекта в редактируемый режим:

pip install --editable path/to/project_dir

, но убедитесь, что в файле есть минимальный setup.py project_dir со следующим содержимым

from setuptools import setup
setup(name='myproject')

pip поместит символическую ссылку myproject.egg-info в вашу папку site-packages , которую вы можете проверить это с помощью

pip show myproject

Это позволяет вам импортировать ваши пакеты, используя так называемый абсолютный импорт , всегда начиная с вашего каталог_проекта

from src.packages.import_tools import tool_a

(Примечание что ваш import packages.import_tools as imptool все равно не работает, поскольку import_tools - это пакет, а не модуль.)

Следующие вещи, которые вы можете добавить в project_dir , - это Папка README.MD , needs.txt и test для ваших юнит-тестов. И имейте в виду, что различие между scripts и пакетов несколько искусственно, потому что все файлы Python в основном являются модулями, которые можно импортировать.

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