Чем отличаются pyenv и pipenv и когда их следует использовать

Table of Contents
🐍 Introduction
🐍 TL;DR
🐍 pyenv
🐍 pipenv
🐍 Conclusion

[Обновление: 2021–08–15 установка pyenv]

Введение: pyenv vs pipenv vs virtualenv

Я использовал Python 3.7.7 + virtualenv, и однажды я установил 3.8.2. Это создавало проблемы с Jupyter Notebook. Он не работал, и я получал всевозможные сообщения об ошибках.

Я думал, что мне нужно разобраться в среде Python. Мне нужно было узнать, что делают pyenv, pipenv и virtualenv. Это статья о том, что я узнал.

Python выпустил 13 версий в течение 2019 года и 12 версий в течение 2018 года. Большинство языков программирования имеют некоторые виды управления версиями.

Узел имеет nvm, а Ruby - RVM и т. Д. Pyenv - это управление версиями Python.

Он устанавливает / удаляет разные версии Python, устанавливает глобальную и локальную (директорию) версии Python.

Pyenv-virtualenv - это подключаемый модуль pyenv, который управляет виртуальными средами Python в UNIX-подобных системах.

Управление зависимостями - это процесс управления всеми взаимосвязанными библиотеками и пакетами в рамках проекта для обеспечения успешной работы ваших проектов.

Pipenv - это упаковочный инструмент для приложения Python, который управляет зависимостями пакетов и их подчиненными зависимостями.

pipenv упрощает процесс разработки за счет использования Pipfile в среде разработки и aPipfile.lock в производственной среде. pipenv также управляет виртуальными средами.

Virtualenv - это инструмент для создания изолированных сред Python. Если вы устанавливаете virtualenv под python 3.8, virtualenv по умолчанию создает виртуальные среды, которые также имеют версию 3.8.

Это означает, что если вы обновите свой системный Python, ваши виртуальные среды могут сломаться. Это случилось со мной, когда я обновился до Python3.7.7.

Вы можете использовать pyenv и pipenv в своих проектах Python, и в этой статье вы узнаете обо всем, от их установки до их использования. Как я упоминал ранее, у pyenv есть собственный virtualenv, pyenv-virtualenv.

Когда вы используете virtualenv отдельно, он использует системную версию Python. Virtualenvwrapper имеет полезный набор скриптов для virtualenv.

В этой статье я сосредоточусь на pyenv и pipenv, поскольку только virtualenv будет иметь проблемы при обновлении версии Python в вашей системе.

pyenv - это инструмент управления версиями Python + виртуальная среда, а pipenv - инструмент управления пакетами Python и виртуальной среды.

TL;DR

pipenv создает изолированные среды pip, тогда как pyenv + virtualenv создает виртуальные среды, которые могут использовать несколько проектов.

Pyenv

Если вы работаете над своими личными проектами или работаете с несколькими системами, такими как командная или серверная и локальная, вам следует использовать pyenv.

Установка pyenv

Вы можете установить pyenv в macOS и другие ОС Linux. (Если у вас возникли проблемы с установкой, см. Страницу Установка Github pyenv.)

# for macOS
$ brew install pyenv

Добавление следующего в ваш bash_profile / zshrc определит переменную среды PYENV_ROOT.

Для zsh запустите в своем терминале следующее.

$ echo 'eval "$(pyenv init --path)"' >> ~/.zprofile

(Эта часть может быть больше не актуальна, но я оставляю ее для справки.)

pyenv работает, вставляя каталог прокладок перед вашим PATH. прокладка - это небольшая библиотека, которая перехватывает и изменяет вызовы другой библиотеки. Добавление следующего включает прокладки и автозаполнение.

$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.zshrc

Установка версий Python

Список доступных версий Python

$ pyenv install -l
Available versions:
  2.1.3
  2.2.3
  ...

Установка новых версий Python

$ pyenv install 3.7.7
$ pyenv install 3.8.2

Показать все версии Python в вашей системе

$ pyenv versions
3.7.7
3.8.2

Установка глобальной версии Python

$ pyenv global 3.7.7

Проверьте активную версию Python

$ pyenv version
3.7.7 (set by /Users/shinokada/.pyenv/version)

Pyenv местный

pyenv local создает или изменяет .python-verion в каталоге. Например, pyenv local 3.7.7 создает .python-verion с Python 3.7.7. pyenv local 3.8.2 изменяет .python-verion на Python 3.8.2

Как создавать виртуальные среды

Если вы работаете со своими личными проектами и не устанавливаете pipenv, я рекомендую установить pyenv-virtualenv.

Если вы работаете в команде или с несколькими системами, я рекомендую вам установить pipenv, о котором я расскажу дальше.

pyenv-virtualenv - это подключаемый модуль pyenv, который предоставляет функции для управления средами virtualenvs и Conda для Python в UNIX-подобных системах.

Вот инструкция, как установить pyenv-virtualenv.

# For Homebrew users
$ brew install pyenv-virtualenv

Затем вам нужно добавить следующее в ваш .bash_profile или .zshrc.

# pyenv-virtualenv
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

Вы можете создать virtualenv, указав версию Python с именем каталога virtualenv.

# Create a virtualenv called py377 using Python 3.7.7
$ pyenv virtualenv 3.7.7 py377
# Create a virtualenv called py382 using Python 3.8.2
$ pyenv virtualenv 3.8.2 py382
# Create a virtualenv called jupy based on the global Python version
$ pyenv virtualenv jupy

Я часто использую эту команду для создания виртуального окружения.
$ pyenv virtualenv 3.8.6 py386

местный виртуальный

После того, как вы создали разные виртуальные серверы, вы можете установить локальный виртуальный каталог для каталога. Здесь я использую встроенную команду Oh-My-Zsh take.

$ take py377
# Set a local(direcotry) python environment to 377
$ pyenv local py377
(py377)$ cat .python-version
py377

Каждый virtualenv имеет разное хранилище pip

На изображении ниже я обновил pip под virtualenv py377. После изменения local на 3.7.7 и проверки списка пакетов, он показывает разные пакеты python.

Как удалить локальный virtualenv:

Удалив .python-version, вы можете удалить локальный файл virtualenv.

# remvoing .python-version will set the directory to the global Python version
$ rm .python-version

Удалить virtualenv

$ pyenv uninstall my-virtual-env
# or
$ pyenv virtualenv-delete my-virtual-env

Что активирует pyenv?

Вы можете активировать virtualenv:

# Activate py382
$ ~/pythonproject: pyenv activate py382
# cd to py377 which has local virtualenv py377. 
# Activated version py382 overrides the local
(py382) $ ~/pythonproject:  cd py377
# confirming the local virtualenv is py377
(py382) $ ~/pythonproject/py377:  cat .python-version
py377
# Deactivate py382
(py382) $ ~/pythonproject/py377: pyenv deactivate
# Now the local virtualenv py377 is used
(py377) $ ~/pythonproject/py377:

Когда вы activate a virtulaenv, virtualenv переопределит локальный virtualenv.

pipenv

Если ваш проект зависит от версий пакета Python и его зависимостей, pipenv для вас.

pipenv создает Pipfile.lock, и вы используете его при переходе на другую систему.

Pipfile.lock содержит все зависимости и их версии.

Когда вы устанавливаете пакеты Python с помощью Pipfile.lock, он создает точно такую ​​же среду, как и ваша исходная система.

Когда в репо есть файл Pipfile.lock, вы можете установить все пакеты и зависимости с помощью pipenv install.

Давайте установим pipenv с помощью Homebrew. Здесь вы можете найти установку для других ОС.

# macOS
brew install pipenv

Создайте новый проект с помощью Python 3.7:

$ pipenv --python 3.7 install

На изображении выше я использую pipenv --python 3.7.7 для создания нового файла virtualenv. Он отображает расположение virtualenv:

Virtualenv location: /Users/shinokada/.local/share/virtualenvs/pi37-AdrjAtjU

И он создал Pipfile и Pipfile.lock. pipenv использует эти Pipfile и Pipfile.lock для управления версией Python и версией пакетов.

Содержимое Pipfile:

cat Pipfile
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true
[dev-packages]
[packages]
[requires]
python_version = "3.7"

[источник] сообщает источники вашего пакета. [пакеты] - это информация о вашем пакете. [dev-packages] предназначен для ваших требований к разработке. [требуется] - это требуемая версия Python.

Содержимое pipfile.lock:

cat Pipfile.lock
{
    "_meta": {
        "hash": {
            "sha256": "7e7ef69da7248742e869378f84218111f8f0017fddf94d086813baa518a65489"
        },
        "pipfile-spec": 6,
        "requires": {
            "python_version": "3.7"
        },
        "sources": [
            {
                "name": "pypi",
                "url": "https://pypi.org/simple",
                "verify_ssl": true
            }
        ]
    },
    "default": {},
    "develop": {}
}

После установки пакета вы можете найти его и хэши в default файла Pipfile.lock. Это обеспечит идентичную среду в другой системе.

pipenv работает с pyenv

Если в вашей системе нет определенной версии Python, она спросит, хотите ли вы установить версию Python.

$ pipenv --python 3.6
Warning: Python 3.6 was not found on your system…
Would you like us to install CPython 3.6.10 with pyenv? [Y/n]: Y
Installing CPython 3.6.10 with pyenv (this may take a few minutes)…
⠼ Installing python...
$ ls 
Pipfile

Это создаст в каталоге Pipfile.

cat Pipfile
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true
[dev-packages]
[packages]
[requires]
python_version = "3.6"

Установка пакетов

Мы используем pipenv вместо pip для установки пакетов.

$ pipenv install numpy
$ cat Pipfile
...
[packages]
numpy = "*"
...

Это создало Pipfile.lock и добавило numpy ="*" в Pipfile. Вы можете использовать Pipfile.lock для создания той же среды в другой системе.

Установка всех зависимостей для проекта (включая dev):

$ pipenv install --dev

Создайте файл блокировки, содержащий предварительные релизы:

$ pipenv lock --pre

Покажите график установленных вами зависимостей:

$ pipenv graph
numpy==1.18.4

Проверьте установленные зависимости на наличие уязвимостей безопасности:

$ pipenv check
Checking PEP 508 requirements…
Passed!
Checking installed package safety…
An error occurred:
Your API Key '1ab8d58f-5122e025-83674263-bc1e79e0' is invalid. See https://goo.gl/O7Y1rS

Он возвращает ошибку, и я надеюсь, что будущая версия исправит это.

Установите локальный файл setup.py в виртуальную среду / Pipfile:

$ pipenv install -e .

Используйте команду pip нижнего уровня:

$ pipenv run pip freeze

оболочка pipenv и выход

Вы можете активировать virtualenv проекта, запустив pipenv shell, и деактивировать его, запустив exit.

Как вы можете видеть на изображении выше, вы можете использовать pipenv shell и использовать команды pip, такие как list и -U, для обновления пакетов.

Удаление pipenv virtualenv

$ pipenv --rm
Removing virtualenv (/Users/shinokada/.local/share/virtualenvs/pi37-AdrjAtjU)…

Итак, все ваши pipenv хранятся в каталоге ~/.local/share/virutlaenvs.

ls ~/.local/share/virtualenvs
pi36-JaecZ40h pi37-AdrjAtjU

Если хотите, можете удалить pipenv из этого каталога.

виртуальный конфликт pipenv и pyenv

Вот что произойдет, если вы попытаетесь использовать pipenv под pyenv. Будет отображено любезное уведомление.

$ mkdir demo
$ cd demo
# Python version
$ python --version
Python 3.7.7
# create a virtualenv
$ pyenv virtualenv 3.8.2 demo382
Looking in links: /var/folders/17/2xhf1tw15xzd8sz_0hw3gp2h0000gn/T/tmpcn78j8xb
...
# Set the local virtualenv
$ pyenv local demo382
(demo382) $ python --version
Python 3.8.2
# Create pipenv 
$ pipenv --python 3.8
Courtesy Notice: Pipenv found itself running within a virtual environment, so it will automatically use that environment, instead of creating its own for any project. You can set PIPENV_IGNORE_VIRTUALENVS=1 to force pipenv to ignore that environment and create its own instead. You can set PIPENV_VERBOSITY=-1 to suppress this warning.

Pipfile.lock

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

$ pipenv lock

Это создаст или обновит ваш Pipfile.lock.

После того, как вы получите свой код и Pipfile.lock в производственной среде, вы можете установить все пакеты:

$ pipenv install --ignore-pipfile

Это проигнорирует Pipfile для установки и будет использовать Pipfile.lock для установки всех пакетов. Pipenv создаст ту же среду, включая подчиненные зависимости, что и ваша среда разработки.

Заключение

В левой части изображения выше pyenv + pyenv-virtualenv может содержать разные проекты.

Это означает, что pyenv-virtualenv может делиться пакетами с разными проектами. В то время как на pyenv + pipenv каждый проект содержит собственные пакеты / пакеты без совместного использования.

Если вы работаете в команде, вам следует использовать pyenv + pipenv вместе.

Если у вас есть проект, включающий несколько систем, таких как локальный и удаленный сервер, вы также должны использовать их.

Короче говоря, если ваш проект включает более одной системы, вы должны использовать pyenv + pipenv.

pyenv и pipenv имеют разные способы создания виртуальных файлов, но вы можете использовать оба.

Доступны и другие инструменты, которые имеют разные цели и цели, как вы видите на следующей диаграмме.

Новостная рассылка

Получите полный доступ ко всем статьям на Medium, став участником.







Ссылка