Быстрый старт Pipenv

Python

Улучшенный рабочий процесс Pip™

Обновление от 2019.12.15 Понятия не имею Переключитесь на стихи.

Обычно используется в развитии Pythonvirtualenv pipОперационная среда проектов управления и зависимости. Использовать при создании нового проектаvirtualenvСоздайте виртуальную операционную среду, а затем используйтеpipУстановите зависимости и, наконец, используйтеpip freeze > requirements.txtДокументируйте зависимости проекта. В этом процессе возникнут некоторые проблемы:

  • Информация о версии зависимости зависимых пакетов
  • Неудобно обновлять пакеты зависимостей
  • Различие зависимостей между средой разработки и производственной средой

Общий подход к решению вышеупомянутых проблем заключается в создании несколькихrequirements.txt,Например:requirements-dev.txt,requirements-prod.txtИ запишите информацию о версии зависимостей или выберитеPipenv: Python Dev Workflow for Humans.

Это очевидно из названияpipenv = pip + virtualenv.

использовать в разработкеpipenv

используется при разработке проектаpipenvОпыт работы с базовымиpipпоследовательно, и потомуpipenvОн также будет одновременно управлять виртуальной средой, и работа будет более плавной.pipenvиспользоватьPipfileиPipfile.lockдля управления информацией о зависимостях,Pipfile.lockКонтрольное значение хэша и информация о версии будут записаны в соответствии с установленными зависимостями.

Создайте виртуальную среду

В новом каталоге проекта вы можете создать виртуальную среду следующими способами:

$ pipenv --python 3.6
$ pipenv --python /path/to/python
$ pipenv install requests --python 3.6

Примечание: если не используется--pythonЕсли параметр указывает версию Python, он будет создан с версией Python по умолчанию.Если вы хотите указать версию Python по умолчанию, вы можете передать переменную средыPIPENV_DEFAULT_PYTHON_VERSIONКонфигурация, которая может быть установлена ​​на номер версии Python:3.6.8или путь к программе интерпретатора Python.

Если вам нужно указать каталог виртуальной среды выполнения, который будет создан в каталоге проекта, это можно сделать двумя способами:

  • воплощать в жизньpipenvсоздать раньше.venvсодержание
$ mkdir .venv && pipenv install requests --python 3.6
  • настроитьPIPENV_VENV_IN_PROJECTпеременная среды
$ export PIPENV_VENV_IN_PROJECT=1

Если вы хотите настроить этот каталог, вам нужно передать переменные средыWORKON_HOMEнастроить.

Создайте виртуальную среду из существующего проекта

Для существующих проектов его можно разделить на три случая:

  • не использовалpipenv

использоватьpipenv install -r path/to/requirements.txt --python 3.6для установки зависимостей.

  • Намерение использовать, но должна быть совместима со старым способом

пройти черезpipenv lock -r > requirements.txtСоздайте файлы управления зависимостями в том же формате, что и pip.

  • уже используется

Можно использовать по мере необходимостиpipenv installилиpipenv sync. Оба создадут виртуальную среду, используя указанный источник PyPI для следования зависимостям, разницаpipenv installбудет основываться наPipfileУстановите зависимые пакеты с информацией о версии и заново создайтеPipfile.lockpipenv syncбудет основываться наPipfile.lockИнформация о версии в установке зависимостей.

этоpipenv installУстановленная версия пакета зависимостей может быть обновлена, и конкретный механизм подробно описан в разделе Управление пакетами зависимостей.

Активировать виртуальную среду

Вы можете активировать виртуальную среду перед запуском Python:

$ pipenv shell

Или запустить напрямую:

$ pipenv run python main.py

В корневом каталоге проекта есть.envКогда файл конфигурации среды активирован, виртуальная среда будет загружена одновременно..envКонфигурация переменной среды в файле, если вы не хотите использовать эту функцию, вы можете настроить ее с помощьюPIPENV_DONT_LOAD_ENVпеременная, чтобы отключить его.

Управление пакетами зависимостей

pipenvКак использовать инсталляционный пакет иpipВ основном то же самое, выполнять непосредственно в каталоге проектаpipenv install requestПри установке он будет установлен в каталог виртуальной среды, если виртуальной среды нет, он будет установлен после создания.

Инсталляционный пакет

Если информация о версии не указана,Pipfileне будет указывать версию в новом каталоге, если используется в новом каталогеpipenv installУстановите последнюю версию пакета зависимостей напрямую.

$ pipenv install requests

Следующие методы указаны как1.2или выше, но не больше или равно2.0,использоватьpipenv installПри установке зависимостей, если новая версия1.2прибыть2.0Между (не включает2.0версия) будет обновляться

$ pipenv install “requests~=1.2”

Дополнительные версии указаны следующим образом:

$ pipenv install "requests>=1.4"   # 版本号大于或等于 1.4.0
$ pipenv install "requests<=2.13"  # 版本号小于或等于 2.13.0
$ pipenv install "requests>2.19"   # 版本号大于 2.19.0

Если вы используете этот пакет только в среде разработки, вы можете добавить--devУстановка параметров:

$ pipenv install ipython --dev

пакет обновления

  • Доступ к пакетам обновлений
$ pipenv update --outdated
  • Обновить все зависимости
$ pipenv update
  • Обновить указанные зависимости
$ pipenv update request

Примечание. При обновлении версии зависимого пакетаPipfileОграничение информации о средней версии, если вы хотите установить версию за пределами ограничения, вам необходимо выполнитьpipenv install <pkg>Установить.

удалить пакет

$ pipenv uninstall requests
  • Просмотр зависимостей
$ pipenv graph

После установки или удаления зависимых пакетовpipenvбудет обновленоpipfileиpipfile.lock

Настройте источник зеркала PyPI

pipобычно используютpip.confили--index-urlпараметры для настройки источника зеркала PyPI,pipenvСуществует множество конфигураций:

  • Используйте переменные средыPIPENV_PYPI_MIRRORконфигурация.
$ export PIPENV_PYPI_MIRROR=https://mirrors.aliyun.com/pypi/simple/
  • используя проектpipfileконфигурация файла.

по проектуpipfileв файле[[source]]Разделы также могут настраивать источник установки и вступают в силу только для этого проекта.

[[source]]
name = "pypi"
url = "https://mirrors.aliyun.com/pypi/simple/"
verify_ssl = true
...

Сотрудничатьpyenvиспользовать

Можно установить под Linux и macOSpyenvиспользовать вместе сpipenvЕсли указанная версия Python не установлена, она будет вызванаpyenvСкомпилируйте и установите.

Сначала пожалуйста, обратитесь кpyenv: Common build problems - PrerequisitesУстановите зависимости сборки.

затем согласноSimple Python Version Management: pyenv - Installationустановленpyenv.

Примечание. Для пользователей Windows загрузите установочный пакет Python вручную и установите его черезpipenv --python X:\Python\...\python.exeукажите версию Python,Если вы хотите скомпилировать и установить, пожалуйста, решите это самостоятельно.

настроитьpyenv

Вы можете настроить кеш исходного кода и скомпилировать временные пути к файлам по мере необходимости, чтобы решить проблему, связанную с тем, что исходный пакет не может быть загружен из-за проблем с сетью, или/tmpНедостаток места в разделе приводит к сбою компиляции и установки.

  • Кэш исходного пакета

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

$ mkdir -p $(pyenv root)/cache
  • Каталог временных файлов

Использовать системный путь к временному файлу по умолчанию/tmp, укажите другой путь в качестве каталога временных файлов.

$ mkdir ~/tmp
$ export TMPDIR="$HOME/tmp"
  • Некоторые сторонние инструменты для работы с пакетами, такие как PyInstaller, требуют, чтобы CPython--enable-sharedПараметрическая компиляция
$ env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.6.8

использовать в развертыванииpipenv

Чтобы убедиться, что версия зависимостей, установленных во время развертывания, соответствует выпуску, вы не можете использоватьpipenv installДля установки необходимо добавить--deployпараметр.

$ pipenv install --deploy

Если вы не используете виртуальную среду, вам также необходимо добавить--systemпараметр

$ sudo pipenv install --deploy --system

Использование в Докереpipenv

Вот Dockerfile для справки.

FROM python:3.6.8

ENV PIP_INDEX_URL https://mirrors.aliyun.com/pypi/simple/
RUN pip3 install pipenv --no-cache-dir

RUN set -ex && mkdir /app
WORKDIR /app

COPY Pipfile Pipfile
COPY Pipfile.lock Pipfile.lock
RUN set -ex && pipenv install --deploy --system

COPY . /app
EXPOSE 8888
CMD ["python3", "main.py"]

Вы также можете сначала создать базовый образ, а затем использовать его при создании образа приложения, предполагая, что созданный тег базового образаtomczhen/python-pipenv-base:3.6.8.

  • Base Image Dockerfile
FROM python:3.6.8

ENV PIP_INDEX_URL https://mirrors.aliyun.com/pypi/simple/
RUN pip3 install pipenv --no-cache-dir

RUN set -ex && mkdir /app
WORKDIR /app

ONBUILD COPY Pipfile Pipfile
ONBUILD COPY Pipfile.lock Pipfile.lock
ONBUILD RUN set -ex && pipenv install --deploy --system
  • Python Application Image Dockerfile
FROM tomczhen/python-pipenv-base:3.6.8

COPY . /app
EXPOSE 8888
CMD ["python3", "main.py"]

pipenvНедостатки

Конечно, у pipenv есть и недостатки.

блокировка занимает много времени

Lock updating is very slow · Issue #1914 · pypa/pipenv

Это вопрос стоимости.

Так как его нужно генерировать на основе зависимостей и хэшей файловPipfile.lock, эта проблема не должна быть полностью решена в краткосрочной перспективе, она должна бытьpipenvСуществует компромисс между функцией управления зависимостями и скоростью.

Текущий метод заключается в использовании при установке зависимостейpipenv install --skip-lockпропустить сборку/обновлениеPipfile.lock, а затем выполнить при необходимостиpipenv lockгенерировать/обновлятьPipfile.lock

кроссплатформенная проблема

Строго говоря, это неpipenvПроблема.

Некоторые пакеты имеют разные зависимости на разных платформах, напримерPyInstallerМожет использоваться на нескольких платформах, но зависит только от пакета pywin32 в Windows из-заPipfile.lockгенерируется на основе установленного пакета, в предыдущемpipenvВерсия приведет к сбою установки зависимостей при кроссплатформенности (в текущей новой версии проблем нет).

в соответствии сProblem with Pipfile and system specific packages · Issue #1575 · pypa/pipenvСогласно обсуждению в Pywin32, даже если pywin32 исправляет проблему, она может быть решена только в новой версии, поэтому, если есть перекрестная платформа, необходимо определить, нормально ли это.