До сих пор я тестировал различные способы управления зависимостями моего проекта в Python:
- Установка всего глобального с помощью pip (экономит место, но рано или поздно доставляет вам неприятности)
- pip & venv или virtualenv (немного мучительно, но во многих случаях это нормально)
- pipenv & pipfile (немного проще, чем venv/virtualenv, но медленный и некоторые блокировщики, виртуальные envs прячутся где-то еще, чем папка реального проекта)
- conda в качестве менеджера пакетов и среды (отлично, если все пакеты доступны в conda, смешивать pip & conda немного смешно)
- Поэзия - я не пробовал этот
- ...
Моя проблема со всем этим (кроме 1.) заключается в том, что мое место на жестком диске заполняется довольно быстро: я не разработчик, я использую Python для своей повседневной работы. Поэтому у меня есть сотни небольших проектов, которые все делают свое дело. К сожалению, для 80% проектов мне нужны "большие" пакеты: numpy
, pandas
, scipy
, matplotlib
- вы называете это. Типичный небольшой проект содержит от 1000 до 2000 строк кода, но имеет 800 МБ зависимостей пакетов в venv/virtualenv/pipenv. Практически у меня около 100+ ГБ моего жесткого диска, заполненного виртуальными зависимостями Python.
Более того, установка всего этого в каждой виртуальной среде требует времени. Я работаю в Windows, многие пакеты не могут быть легко установлены из pip в Windows: Shapely
, Fiona
, GDAL
- мне нужны предварительно скомпилированные диски от Кристофа Гольке. Это легко, но нарушает большинство рабочих процессов (например, pip install -r requirements.txt
или pipenv install
из pipfile). Я чувствую, что я на 40% устанавливаю/обновляю зависимости пакетов и только 60% своего времени пишу код. Кроме того, ни один из этих менеджеров пакетов действительно не помогает с публикацией & тестирование кода, поэтому мне нужны другие инструменты, например setuptools
, tox
, semantic-release
, twine
...
Я разговаривал с коллегами, но все они сталкиваются с одной и той же проблемой, и ни у кого, похоже, нет реального решения. Мне было интересно, если есть подход, чтобы иметь некоторые пакеты, например, те, которые вы используете в большинстве проектов, устанавливаемых по всему миру - например, numpy
, pandas
, scipy
, matplotlib
будут установлены с pip в C:\Python36\Lib\site-packages
или с conda
в C:\ProgramData\Miniconda3\Lib\site-packages
- это хорошо разработанные пакеты, которые не часто ломают вещи. И если я хотел бы исправить это в ближайшее время в моих проектах.
Другие вещи будут идти в локальных папках virtualenv - я испытываю желание переместить мой текущий рабочий процесс с pipenv
на conda
.
Такой подход имеет смысл вообще? По крайней мере, в последнее время было много разработок в python, возможно, появилось что-то, чего я еще не видел.
Существуют ли рекомендации по настройке файлов в такой смешанной глобально-локальной среде, например, как сохранить setup.py
, requirements.txt
или pyproject.toml
для совместного использования проектов разработки через Gitlab, Github и т.д.? Каковы подводные камни/предостережения?
Также есть это отличное сообщение в блоге от Криса Уоррика, которое объясняет это почти полностью.
[Обновление]
Через полгода я могу сказать, что работа с Conda решила большинство моих проблем:
- он работает в любой системе, WSL, Windows и т.д.
- большинство пакетов уже доступно в conda-forge, легко получить собственные пакеты, принятые в conda-forge
- для тех пакетов, которые не входят в conda, я могу установить
pip
в среде conda и добавить пакеты из pypi с помощью pip - Я могу создать строгий или открытый
environment.yml
, указав приоритет канала conda, пакеты из conda и пакеты из pip - Я могу создать окружение conda из этих ymls в одном выражении, например настроить среду разработки в Gitlab Continuous Integration, используя
Miniconda3 Docker
- это делает тестовые прогоны очень простыми и понятными - версии пакета в
yml
могут быть определены как строгие или открытые, в зависимости от ситуации. Например. вы можете исправить env в Python 3.6, но при этом получить все обновления безопасности в этом диапазоне версий (например, 3.6.9) - Я обнаружил, что conda решает почти все проблемы с зависимостями, скомпилированными в c в Windows
- Что касается проблемы с "большими зависимостями": я закончил тем, что создал много специфических (то есть маленьких) и несколько неспецифических (то есть больших) сред conda: например, у меня довольно большая
jupyter_env
, где лаборатория jupyter и большая часть моей научной работы пакеты установлены (numpy, geos, pandas scipy и т.д.) - я активирую его всякий раз, когда мне нужен доступ к этим инструментам, я могу хранить их в одном месте. Для разработки конкретных пакетов у меня есть дополнительные среды, которые используются только для зависимостей пакетов (например,packe1_env
). Некоторые базовые инструменты установлены в базовой среде conda, например,pylint
. - Я постоянно обновляюсь с Chocolatey менеджером пакетов для Windows.
choco upgrade all -Y
раз в неделю, работает как шарм! - Новое обновление: одна из самых удивительных функций: новый флаг
--stack
позволяет накапливать среды conda, например.conda activate my_big_env
затемconda activate --stack dev_tools_env
(по состоянию на 2019-02-07) позволяет сделать некоторые пакеты общего назначения доступными во многих envs - Новое обновление 2: я начал использовать
conda
изWindows Subsystem for Linux
(WSL), это снова улучшило мой рабочий процесс: пакеты устанавливаются быстрее, я могу работать с VS Code в Windows, напрямую подключенной к WSL, и далеко меньше ошибок с пакетами Python в среде Linux.
Один общий недостаток заключается в том, что conda становится немного медленным при использовании большого канала conda-forge. Они работают над этим, но в то же время индекс conda-forge растет очень быстро.