Вопрос или проблема
Я разрабатываю библиотеку уже довольно долго. Ее структура следующая:
pgk1 # центральная библиотека
... # подсистемы и модули
requirements.txt # соответствующие зависимости
Эта библиотека предназначена только для внутренних нужд и не может быть загружена в PyPI, также ее нельзя установить в центральный сайт-пакетов моего интерпретатора.
Так что моя идея заключалась в том, чтобы установить центральное место для таких библиотек под PYTHONPATH, чтобы я мог легко импортировать как from pkg1 import XY для каждого нового проекта, который я начинаю.
Проблема в том, что pkg1 имеет свой requirements.txt для venv, которые неизвестны / не установлены в текущем проекте (текущем venv), и во время выполнения будет вызвана ошибка ImportError.
Конечно, я мог бы скопировать requirements.txt из pkg1 в новый requirements.txt
, но это было бы утомительно.
Я буду очень благодарен за любые советы, которые помогут мне переработать более простой рабочий процесс с такими зависимостями.
- Создайте вашу библиотеку
pkg1
в виде пакета и определите все зависимости в пакете. - Соберите свой пакет (вручную или с помощью чего-то наподобие пакета build), чтобы создать Wheel или Source Distribution (SDist).
- Создайте локальный PIP-репозиторий и включите Wheel/SDist для
pkg1
в локальный репозиторий. (Это может быть так же просто, как каталог, содержащий файлы Wheel/Source Distribution, созданные из сборки, и HTML индексные файлы, которые содержат ссылки на файлы. Вы можете автоматически сгенерировать его из каталога, используя пакетpiprepo
, но не слишком сложно написать собственный скрипт, если вы не хотите зависеть от сторонних библиотек. Или, если хотите, вы можете настроить локальный веб-сервер для репозитория.) - Когда вы хотите использовать
pkg1
в другом проекте, включите его вrequirements.txt
/setup.py
/pyproject.toml
для нового проекта. - Когда вы хотите установить его в виртуальной среде, если вы используете
requirements.txt
, используйте--extra-index-url
параметр командной строки:python -m pip install --extra-index-url /path/to/your/local/repo -r requirements.txt
Чтобы установить зависимости для нового проекта. Он попытается получить
pkg1
из локального репозитория (а также попытается получить его из PyPi, что, предполагая, что нет другого пакета с тем же именем, не удастся – но это не проблема, если он находится в локальном репозитории). Если вы правильно создали пакет на шаге #1, тогда установкаpkg1
также попытается установить зависимостиpkg1
и, рекурсивно, их зависимости.
Ответ или решение
Проблемы с повторным использованием разработанной библиотеки: детальный анализ
При разработке библиотеки, такой как pkg1
, внутренние зависимости и ошибки импорта могут стать серьезными преградами для эффективного повторного использования кода в различных проектах. В данном контексте, даже если вы создали центральное место для вашей библиотеки в переменной окружения PYTHONPATH
, важно учитывать несколько факторов, чтобы избежать проблем на этапе импорта. Давайте посмотрим на ключевые вопросы, связанные с повторным использованием вашей библиотеки.
1. Отсутствие управления зависимостями
Основной проблемой, с которой вы сталкиваетесь, является наличие файла requirements.txt
, который определяет зависимости для вашей библиотеки, но не синхронизируется с зависимостями новых проектов. Это может привести к неправильной работе приложений из-за отсутствия необходимых библиотек, что, в свою очередь, вызывает ошибки импорта.
Решение: Лучше всего создать стандартный пакет Python, что позволит вам определить все зависимости в одном месте и избежать дублирования. Используйте инструменты, такие как setuptools
, чтобы создать структуру пакета и указать все зависимости в setup.py
или pyproject.toml
. Это обеспечит автоматическую установку зависимостей при установке вашего пакета.
2. Копирование зависимостей
Копирование списка зависимостей из requirements.txt
вашей библиотеки в каждый новый проект является утомительной и подверженной ошибкам практикой. Если библиотека изменяется, вам придется обновить каждый проект вручную.
Решение: Создание локального PIP-репозитория позволит вам хранить ваши библиотеки вместе с их зависимостями и управлять ими централизованно. Вы можете использовать такие инструменты, как piprepo
для автоматизации этого процесса. Когда вашему проекту нужна библиотека, достаточно указать её в requirements.txt
проекта единожды, и все зависимости будут автоматически загружены.
3. Проблемы с установкой зависимости в виртуальных окружениях
Если вы пытаетесь импортировать библиотеки из pkg1
, но зависимости не установлены в текущем виртуальном окружении, вам все равно придется вручную устанавливать эти зависимости, что нарушает рабочий процесс.
Решение: Во-первых, установите вашу библиотеку из локального репозитория, используя параметр --extra-index-url
. Например:
python -m pip install --extra-index-url /path/to/your/local/repo -r requirements.txt
Это вызовет установку не только вашей библиотеки, но и всех её зависимостей, что значительно упростит процесс.
4. Инициализация и управление проектами
При создании нового проекта без автоматизированного процесса интеграции с вашей библиотекой можно столкнуться с необходимостью каждый раз повторять начальную конфигурацию.
Решение: Рекомендуется использовать шаблоны проектов, где файл requirements.txt
уже включает вашу библиотеку. Это можно сделать с помощью инструментов управления проектами, таких как cookiecutter
, которое может автоматически генерировать новый проект с заданной структурой и файлами настроек.
Заключение
Повторное использование вашей библиотеки pkg1
требует систематического подхода к управлению зависимостями и средами. Автоматизация этого процесса с помощью создания пакетов, локальных PIP-репозиториев и шаблонов проектов не только упростит вашу работу, но и приведет к лучшей стабильности и предотвращению ошибок. Следуя предложенным рекомендациям, вы сможете оптимизировать рабочий процесс и сделать использование вашей библиотеки более эффективным и менее подверженным ошибкам.