Я уже тестировал различные способы управления моими проектными зависимостями в 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
- это делает тестовые прогоны очень простыми и понятными. * Пакеты версий 1080 * - в
yml
s могут быть определены строго илиоткрыть, в зависимости от ситуации.Например, вы можете исправить env в Python 3.6, но при этом получить все обновления безопасности в этом диапазоне версий (например, 3.6.9) - Я обнаружил, что conda решает почти все проблемы с зависимостями, скомпилированными с помощью c в Windows
- относительно проблемы с "большими зависимостями": в итоге я создал много специфических (то есть маленьких) и несколько неспецифичных (то есть больших)) среды conda: например, у меня есть довольно большой
jupyter_env
, где установлена jupyter lab и большинство моих научных пакетов (numpy, geos, pandas scipy и т. д.) - я активирую его всякий раз, когда мне нужен доступ к этим инструментам, яможет держать их в курсе в одном месте.Для разработки конкретных пакетов у меня есть дополнительные среды, которые используются только для зависимостей пакетов (например, packe1_env
).Некоторые базовые инструменты установлены в базовой среде conda, например, pylint
. - Я постоянно обновляю conda с помощью Chocolatey диспетчера пакетов для Windows.
choco upgrade all -Y
один раз в неделю, работает как шарм! - Новое обновление: одна из самых удивительных функций: новый флаг
--stack
позволяет складывать среды conda, например, conda activate my_big_env
затемconda activate --stack dev_tools_env
(по состоянию на 2019-02-07 ) позволяет сделать некоторые пакеты общего назначения доступными во многих envs
Одним общим недостатком является то, что при использованиибольшой конда-кузнечный канал.Они работают над этим , но в то же время индекс conda-forge очень быстро растет.