Source env bin activate windows

For those of you crazy enough to have a custom DOS prompt, venv activation may fail, depending on your %PROMPT% environment variable content.

Say you have a DOS prompt defined as follows:

set PROMPT=$_$E[1;30;40m[$E[0;36;40m%computername% | %userdomain%\%username%$E[1;30;40m] $E[0;33;40m$M$_$E[35;40m$d$s$t$h$h$h$h$h$h$_$E[1;33;40m$p$_$E[1;30;40m$g $E[0;37;40m

(btw, it shows as follows, with some fancy colors:

[W10-MY_COMPUTER | W10-MY_COMPUTER\JOHNDOE]
15/09/2022 20:31
F:\
> echo "Hello World"
Hello World

[W10-MY_COMPUTER | W10-MY_COMPUTER\JOHNDOE]
15/09/2022 20:31
F:\
>

)

Then if you try to activate a venv :

.\venv\Scripts\activate.bat

it may fail with a rather unclear error that states:

Path not found

without further indications.

The trick is that activate.bat(/deactivate.bat) scripts try to save(/restore) the %PROMPT% variable with this syntax:

...
set _OLD_VIRTUAL_PROMPT=%PROMPT%
...
set PROMPT=(venv) %PROMPT%
...

It can be fixed with this syntax:

...
set "_OLD_VIRTUAL_PROMPT=%PROMPT%"
...
set "PROMPT=(venv) %PROMPT%"
...

now it shows:

[W10-MY_COMPUTER | W10-MY_COMPUTER\JOHNDOE]
15/09/2022 20:31
F:\
> venv\Scripts\activate.bat


(venv)
[W10-MY_COMPUTER | W10-MY_COMPUTER\JOHNDOE]
15/09/2022 20:31
F:\
>

For those of you crazy enough to have a custom DOS prompt, venv activation may fail, depending on your %PROMPT% environment variable content.

Say you have a DOS prompt defined as follows:

set PROMPT=$_$E[1;30;40m[$E[0;36;40m%computername% | %userdomain%\%username%$E[1;30;40m] $E[0;33;40m$M$_$E[35;40m$d$s$t$h$h$h$h$h$h$_$E[1;33;40m$p$_$E[1;30;40m$g $E[0;37;40m

(btw, it shows as follows, with some fancy colors:

[W10-MY_COMPUTER | W10-MY_COMPUTER\JOHNDOE]
15/09/2022 20:31
F:\
> echo "Hello World"
Hello World

[W10-MY_COMPUTER | W10-MY_COMPUTER\JOHNDOE]
15/09/2022 20:31
F:\
>

)

Then if you try to activate a venv :

.\venv\Scripts\activate.bat

it may fail with a rather unclear error that states:

Path not found

without further indications.

The trick is that activate.bat(/deactivate.bat) scripts try to save(/restore) the %PROMPT% variable with this syntax:

...
set _OLD_VIRTUAL_PROMPT=%PROMPT%
...
set PROMPT=(venv) %PROMPT%
...

It can be fixed with this syntax:

...
set "_OLD_VIRTUAL_PROMPT=%PROMPT%"
...
set "PROMPT=(venv) %PROMPT%"
...

now it shows:

[W10-MY_COMPUTER | W10-MY_COMPUTER\JOHNDOE]
15/09/2022 20:31
F:\
> venv\Scripts\activate.bat


(venv)
[W10-MY_COMPUTER | W10-MY_COMPUTER\JOHNDOE]
15/09/2022 20:31
F:\
>

Содержание:развернуть

  • Настройка виртуального окружения
  • Создание

  • Активация

  • Автоматическая активация

  • Деактивация

  • Альтернативы venv

Все сторонние пакеты устанавливаются менеджером PIP глобально. Проверить это можно просто командой pip show <имя_пакета>.

root@purplegate:~# pip3 show pytest
Name: pytest
Version: 5.3.2
Summary: pytest: simple powerful testing with Python
Home-page: https://docs.pytest.org/en/latest/
Author: Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, ...
License: MIT license
Location: /usr/local/lib/python3.8/site-packages
Requires: more-itertools, pluggy, py, wcwidth, attrs, packaging
Required-by:

Location — путь до ваших глобальных пакетов.

В большинстве случаев, устанавливать пакеты глобально — плохая идея 🙅‍♂️ Почему? Рассмотрим простой пример:

Допустим у нас есть два проекта: «Project A» и «Project B». Оба проекта зависят от библиотеки Simplejson. Проблема возникает, когда для «Project A» нужна версия Simplejson 3.0.0, а для проекта «Project B» — 3.17.0. Python не может различить версии в глобальном каталоге site-packages — в нем останется только та версия пакета, которая была установлена последней.

Решение данной проблемы — создание виртуального окружения (virtual environment).

Основная цель виртуального окружения Python — создание изолированной среды для python-проектов

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

Настройка виртуального окружения

Один из самых популярных инструментов для создания виртуального окружения — virtualenv. Однако в данной статье мы будем рассматривать более свежий инструмент venv.

Устанавливать venv не нужно — он входит в стандартную библиотеку Python

Создание

Для создания виртуального окружения, перейдите в директорию своего проекта и выполните:

python -m venv venv

-m — флаг для запуска venv как исполняемого модуля.
venv — название виртуального окружения (где будут храниться ваши библиотеки).

В результате будет создан каталог venv/ содержащий копию интерпретатора Python, стандартную библиотеку и другие вспомогательные файлы. Все новые пакеты будут устанавливаться в venv/lib/python3.x/site-packages/.

Содержимое каталога venv.

Виртуальное окружение также можно создать в IDE PyCharm, для этого:

  1. Зайдите в настройки интерпретатора («Settings» → «Project:<name>» → «Project Interpreter«);
  2. Нажмите на шестеренку в верхнем правом углу, выберите «Add..«;
  3. Выберите «Virual Enviroment» и задайте параметры.

Создание виртуального окружения в IDE PyCharm.

Активация

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

  • venv\Scripts\activate.bat — для Windows;
  • source venv/bin/activate — для Linux и MacOS.

source выполняет bash-скрипт без запуска дополнительного bash-процесса.

Проверить успешность активации можно по приглашению оболочки. Она будет выглядеть так:

(venv) root@purplegate:/var/test#

Также новый путь до библиотек можно увидеть выполнив команду:

python -c "import site; print(site.getsitepackages())"

Если вы используете IDE PyCharm, то при открытии проекта он автоматически найдет созданное виртуальное окружение и уведомит о его использовании. Проверить настройки виртуального окружения можно в «Settings» → «Project:<name>» → «Project Interpreter» (путь до интерпретатора должен быть вида [путь до проекта]/venv/Scripts/python.exe).

Интересный факт: в виртуальном окружении вместо команды python3 и pip3, можно использовать python и pip

Автоматическая активация

В некоторых случаях, процесс активации виртуального окружения может показаться неудобным (про него можно банально забыть 🤷‍♀️).

На практике, для автоматической активации перед запуском скрипта, создают скрипт-обертку на bash:

#!/usr/bin/env bash

source $BASEDIR/venv/bin/activate
python $BASEDIR/my_app.py

Теперь можно установить права на исполнение и запустить нашу обертку:

chmod +x myapp/run.sh
./myapp/run.sh

Деактивация

Закончив работу в виртуальной среде, вы можете отключить ее, выполнив консольную команду:

deactivate

Альтернативы venv

На данный момент существует несколько альтернатив для venv:

  • pipenv — это pipfile, pip и virtualenv в одном флаконе;
  • pyenv — простой контроль версий Питона;
  • poetry — новый менеджер для управления зависимостями;
  • autoenv — среды на основе каталогов;
  • pew — инструмент для управления несколькими виртуальными средами, написанными на чистом Python;
  • rez — интегрированная система конфигурирования, сборки и развертывания пакетов для программного обеспечения.

Стоит ли использовать виртуальное окружение в своей работе — однозначно да. Это мощный и удобный инструмент изоляции проектов друг от друга и от системы. С помощью виртуального окружения можно использовать даже разные версии Python!

Однако рекомендуем присмотреться к более продвинутым вариантам, например к pipenv или poetry.

Python знаменит своей обширной стандартной библиотекой и девизом
«батарейки в комплекте»
(batteries included).
Даже из коробки Python позволяет удобно и быстро решить огромный пласт задач,
например, например, работа с файлами, запуск простого веб-сервера,
работа с электронной почтой, парсинг XML и JSON, и так далее. Во всяком случае,
это намного удобнее, чем писать shell-скрипты 😅

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

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

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

и понеслась! Множество библиотек в своих инструкциях по установке именно так
и предлагают их устанавливать. Это и правда работает, это и правда так просто,
но есть нюансы. В этом месте закопаны очень популярные грабли, по которым
прошлось множество начинающих питонистов, в том числе и я.

Как pip устанавливает пакеты

Давайте разберемся, что же происходит, когда юзер набирает в терминал такую
команду. В общих чертах происходит следующее.

  1. pip обращается в PyPI (Python Package Index) и
    находит там запрашиваемый пакет.
  2. Пакет скачивается. Обычно это просто zip-архив, который содержит
    код библиотеки, разложенный внутри согласно формату. Современным и
    рекомендуемым форматом пакетов является wheel (PEP-427),
    но в дикой природе встречаются и другие форматы.
  3. pip устанавливает пакет.
  4. Библиотека установлена, ее можно импортировать и использовать.

Давайте подробнее разберем третий шаг. Установка пакета — звучит загадочно и
сложно, но на самом деле ничего сложного здесь не происходит. pip просто
распаковывает zip-архив в определенное место (это справедливо для формата wheel,
для установки пакетов в других форматах могут потребоваться дополнительные
действия, но давайте разберем самый распространённый и простой случай). Куда
именно происходит установка? Это можно узнать, выполнив следующую команду:

$ python -m site
sys.path = [
    '/Users/and-semakin',
    '/Users/and-semakin/.asdf/installs/python/3.8.2/lib/python38.zip',
    '/Users/and-semakin/.asdf/installs/python/3.8.2/lib/python3.8',
    '/Users/and-semakin/.asdf/installs/python/3.8.2/lib/python3.8/lib-dynload',
    '/Users/and-semakin/env/lib/python3.8/site-packages',
]
USER_BASE: '/Users/and-semakin/.local' (exists)
USER_SITE: '/Users/and-semakin/.local/lib/python3.8/site-packages' (doesn't exist)
ENABLE_USER_SITE: False

В списке sys.path можно увидеть директорию site-packages — именно туда
и будет установлена библиотека. Давайте в этом убедимся.

До установки пакета:

$ ls -l /Users/and-semakin/env/lib/python3.8/site-packages
total 8
drwxr-xr-x   3 and-semakin  awesome    96 Apr 18 17:39 __pycache__
-rw-r--r--   1 and-semakin  awesome   126 Apr 18 17:39 easy_install.py
drwxr-xr-x   7 and-semakin  awesome   224 Apr 18 17:39 pip
drwxr-xr-x   9 and-semakin  awesome   288 Apr 18 17:39 pip-19.2.3.dist-info
drwxr-xr-x   7 and-semakin  awesome   224 Apr 18 17:39 pkg_resources
drwxr-xr-x  42 and-semakin  awesome  1344 Apr 18 17:39 setuptools
drwxr-xr-x  11 and-semakin  awesome   352 Apr 18 17:39 setuptools-41.2.0.dist-info

Установим пакет:

После установки пакета:

$ ls -l /Users/and-semakin/env/lib/python3.8/site-packages
total 8
drwxr-xr-x   3 and-semakin  awesome    96 Apr 18 17:39 __pycache__
drwxr-xr-x   7 and-semakin  awesome   224 Apr 18 17:41 certifi
drwxr-xr-x   8 and-semakin  awesome   256 Apr 18 17:41 certifi-2020.4.5.1.dist-info
drwxr-xr-x  43 and-semakin  awesome  1376 Apr 18 17:41 chardet
drwxr-xr-x  10 and-semakin  awesome   320 Apr 18 17:41 chardet-3.0.4.dist-info
-rw-r--r--   1 and-semakin  awesome   126 Apr 18 17:39 easy_install.py
drwxr-xr-x  11 and-semakin  awesome   352 Apr 18 17:41 idna
drwxr-xr-x   8 and-semakin  awesome   256 Apr 18 17:41 idna-2.9.dist-info
drwxr-xr-x   7 and-semakin  awesome   224 Apr 18 17:39 pip
drwxr-xr-x   9 and-semakin  awesome   288 Apr 18 17:39 pip-19.2.3.dist-info
drwxr-xr-x   7 and-semakin  awesome   224 Apr 18 17:39 pkg_resources
drwxr-xr-x  21 and-semakin  awesome   672 Apr 18 17:41 requests
drwxr-xr-x   8 and-semakin  awesome   256 Apr 18 17:41 requests-2.23.0.dist-info
drwxr-xr-x  42 and-semakin  awesome  1344 Apr 18 17:39 setuptools
drwxr-xr-x  11 and-semakin  awesome   352 Apr 18 17:39 setuptools-41.2.0.dist-info
drwxr-xr-x  16 and-semakin  awesome   512 Apr 18 17:41 urllib3
drwxr-xr-x   8 and-semakin  awesome   256 Apr 18 17:41 urllib3-1.25.9.dist-info

Как видим, в директорию site-packages добавилась библиотека requests вместе
со всеми своими зависимостями.

Важные мысли, которые я пытаюсь донести:

  1. установка библиотеки напрямую влияет на файловую систему;
  2. у интерпретатора Python есть только одна директория site-packages, куда
    pip и устанавливает пакеты.

А это значит, что в один интерпретатор Python нельзя установить две версии
одной библиотеки одновременно. При установке новой версии предыдущая «перезатирается».
Просто как если бы вы распаковали другой архив с совпадающими именами файлов
в то же самое место.

Боль — это жизненный опыт

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

Например, проект А:

# requirements.txt
requests==2.23.0

Проект Б:

# requirements.txt
requests==1.2.3

Вы просто не сможете работать над такими проектами одновременно. Установка
зависимостей одного проекта сломает другой, и наоборот. При переключении между
проектами придётся каждый раз устанавливать зависимости нужного проекта, что
довольно легко забыть сделать.

Ситуация кажется маловероятной, но я гарантирую, что рано или поздно это
случится, если устанавливать зависимости всех своих проектов в один интерпретатор.
Всё усугубляется тем фактом, что прямые зависимости вашего проекта тянут за
собой свои зависимости (под-зависимости),
те, в свою очередь, тоже могут от чего-то зависеть (под-под-зависимости). В
итоге вы получаете целое дерево зависимостей. И если где-то в этом дереве
окажется библиотека не той версии, что ожидалось, то весь проект может начать
очень странно работать. Вы получите такие эзотерические ошибки, которых
еще никто в интернете до вас не встречал. Если всё сразу сломалось, то считайте,
что легко отделались — по крайней мере, так довольно просто понять, в чём проблема.
Но бывают и ситуации намного хуже, когда приложение просто начинает немножко
иначе работать, без каких-либо ошибок, и возможно придется потратить долгие
часы на траблшутинг, чтобы найти настоящую причину.

Надеюсь, я убедил вас, что устанавливать зависимости нескольких проектов в
один интерпретатор — это очень-очень плохо. Но как же тогда правильно?

Виртуальные окружения

Решение очевидно — у каждого проекта должен быть свой интерпретатор Python,
со своей собственной изолированной директорией site-packages. Это и есть
основная идея, стоящая за виртуальными окружениями. Виртуальное окружение —
это самостоятельная копия интерпретатора со своими пакетами.

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

Начиная с Python версии 3.5 (на данный момент это самая старая из официально
поддерживаемых версий языка, так что справедливо ожидать, что как минимум
везде установлен Python 3.5 или новее), создать виртуальное окружение стало
очень просто:

$ python -m venv <путь к виртуальному окружению>

Например, допустим, что мы работаем над проектом blog_source:

# заходим в директорию с проектом
$ cd src/blog_source

# создаем виртуальное окружение прямо рядом с кодом в директории env
$ python -m venv env

Создавать виртуальное окружения рядом с кодом — это распространённая практика,
так проще ничего не перепутать, но вообще виртуальное окружение может быть
где угодно, и директория тоже может называться как угодно. Обратите внимание,
что если вы создаете виртуальное окружение в директории под управлением
системы контроля версий (git), то его не нужно коммитить.
Лучше вообще добавьте его (env/) в .gitignore.

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

то в виртуальном окружении будет та же самая версия:

$ env/bin/python -V
Python 3.8.2

Активируем окружение

Посмотрим, что внутри директории env:

$ ls -l env/
total 8
drwxr-xr-x  13 and-semakin  awesome  416 Apr 18 18:55 bin
drwxr-xr-x   2 and-semakin  awesome   64 Apr 18 18:55 include
drwxr-xr-x   3 and-semakin  awesome   96 Apr 18 18:55 lib
-rw-r--r--   1 and-semakin  awesome  113 Apr 18 18:55 pyvenv.cfg

$ ls -l env/bin/
total 88
-rw-r--r--  1 and-semakin  awesome  8471 Apr 18 18:55 Activate.ps1
-rw-r--r--  1 and-semakin  awesome  2218 Apr 18 18:55 activate
-rw-r--r--  1 and-semakin  awesome  1270 Apr 18 18:55 activate.csh
-rw-r--r--  1 and-semakin  awesome  2422 Apr 18 18:55 activate.fish
-rwxr-xr-x  1 and-semakin  awesome   268 Apr 18 18:55 easy_install
-rwxr-xr-x  1 and-semakin  awesome   268 Apr 18 18:55 easy_install-3.8
-rwxr-xr-x  1 and-semakin  awesome   250 Apr 18 18:55 pip
-rwxr-xr-x  1 and-semakin  awesome   250 Apr 18 18:55 pip3
-rwxr-xr-x  1 and-semakin  awesome   250 Apr 18 18:55 pip3.8
lrwxr-xr-x  1 and-semakin  awesome    59 Apr 18 18:55 python -> /Users/and-semakin/.asdf/installs/python/3.8.2/bin/python
lrwxr-xr-x  1 and-semakin  awesome     6 Apr 18 18:55 python3 -> python

Обратите внимание, что в директории bin есть некий файл activate в
нескольких вариантах для разных шеллов. Это и есть «точка входа» в виртуальное
окружение. Просто создать виртуальное окружение мало, нужно его активировать.
Но сначала проверим, какие python и pip (исполняемые файлы) используются
в обычном режиме работы:

$ which python
/Users/and-semakin/.asdf/shims/python
$ which pip
/Users/and-semakin/.asdf/shims/pip

Это мой обычный Python, вне виртуального окружения, назовём его глобальным.
Теперь активируем виртуальное окружение:

$ source env/bin/activate
(env) $

Для Windows процесс активации будет отличаться (допустим, что виртуальное окружение
создано в C:\src\blog_source):

# cmd
C:\src\blog_source\> env\Scripts\activate.bat

# либо в PowerShell
PS C:\src\blog_source\> env\Scripts\Activate.ps1

Обратите внимание, что приветствие шелла изменилось (добавилось (env)), чтобы
показать, что мы «внутри» виртуального окружения под названием env.

Теперь проверим еще раз, какие python и pip используются:

(env) $ which python
/Users/and-semakin/src/blog_source/env/bin/python
(env) $ which pip
/Users/and-semakin/src/blog_source/env/bin/pip

Посмотрите на пути — мы внутри виртуального окружения! Теперь можно смело
устанавливать любые пакеты, и это никак не повлияет на глобальный Python или
на другие виртуальные окружения:

(env) $ pip install requests flask whatever-you-need

Можно запускать любые файлы, и они будут иметь доступ к установленным пакетам:

(env) $ python make_money.py
Done! You are rich!

IDE тоже нужно настроить, указав путь к bin/python внутри виртуального
окружения, тогда редактор сможет лучше вам помогать.

По завершению работы с виртуальным окружением можно просто набрать deactivate,
либо закрыть окно терминала:

(env) $ deactivate
$ which python
/Users/and-semakin/.asdf/shims/python

И мы видим, что команда python снова вызывает глобальный интерпретатор.
При этом виртуальное окружение осталось в своей директории, оно просто не
активно. В следующий раз, когда будет нужно поработать с виртуальным
окружением, не забудьте снова его активировать.

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

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

Вот так можно работать с виртуальными окружениями в Python. Всегда устанавливайте
зависимости проектов только в изолированные виртуальные окружения. Не смешивайте
зависимости разных проектов в одном окружении.

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

Ничего не устанавливайте в глобальный интерпретатор

Иногда возникает желание установить какой-нибудь пакет прямо в глобальный
интерпретатор, потому что по смыслу этот пакет вроде как должен быть вне
виртуальных окружений. Например, это может быть какая-нибудь программа,
типа poetry,
docker-compose,
youtube-dl или
howdoi. Руки набирают в терминал:

Установка начинается, прогресс-бары заполняются, но в итоге всё завершается
чем-то типа такого:

error: could not create '/lib/python2.7/site-packages/poetry': Permission denied

Можно попробовать установить, используя sudo, и это сработает, но это
считается очень плохой практикой,
и я настоятельно рекомендую так не делать по нескольким причинам:

  1. Угроза безопасности.

    В секции про установку пакетов я упомянул, что для пакетов других форматов,
    кроме wheel, могут потребоваться дополнительные действия. На самом деле,
    при установке пакета формата sdist исполняется файлsetup.py, в котором
    потенциально могут содержаться любые действия — от честной установки пакета,
    до rm -rf / или установки криптомайнера в систему. Т.к. в PyPI пакет
    загрузить может кто угодно, никогда нельзя быть уверенным, что именно сделает пакет
    при установке. Выполнять такой скрипт с системными привилегиями (sudo) —
    не самый мудрый ход.

  2. Может нарушить целостность системы.

    Часто в операционных системах принято устанавливать программы через
    пакетный менеджер (будь то apt, dnf или pacman). Этот же пакетный
    менеджер затем может без следа удалить установленную программу, потому что он
    ведёт учёт файлов — какой программе какие файлы принадлежит. Если начать
    изменять файлы программ каким-либо образом, помимо пакетного менеджера,
    то это может нарушить его работу. pip, конечно, установит что нужно,
    но после этого могут возникнуть проблемы с системным пакетным менеджером.

Как правильно:

  1. сказать pip, чтобы он установил пакет не в директорию site-packages, а в
    домашнюю директорию пользователя при помощи флага --user:

    $ pip install --user poetry  # без sudo!
    

    Обязательно нужно убедиться, что директория, куда установится пакет,
    перечислена в переменной $PATH. Путь к директории можно получить при помощи
    следующей команды:

    $ python -m site --user-base
    /Users/and-semakin/.local
    

    К получившемуся пути нужно в конце добавить /bin для Linux и MacOS,
    либо \Scripts для Windows, так что
    в моём случае (MacOS) в $PATH нужно добавить вот такой путь:
    /Users/and-semakin/.local/bin.

    Подробнее про этот метод установки читайте здесь.

  2. установить программу через пакетный менеджер ОС, например:

    $ sudo dnf install python-poetry
    

    Часто мейнтейнеры ОС создают обёртки для пакетов из PyPI, которые можно
    установить при помощи системного пакетного менеджера. Как правило, такие
    обёртки называются python-<имя пакета> или python3-<имя пакета>.
    Это делается как раз для того, чтобы дать пользователям возможность
    устанавливать Python-программы, не нарушая работу пакетного менеджера ОС.
    Кроме того, эти пакеты проходят проверку безопасности, так что риск получить
    криптомайнер значительно ниже.

Выводы

  • всегда устанавливайте зависимости проектов в отдельные виртуальные окружения;
  • если нужно установить пакет «глобально», то используйте либо pip install --user ...,
    либо прибегните к помощи пакетного менеджера операционной системы;
  • никогда не используйте sudo pip ... — считайте, что это табу.

Да, виртуальные окружения — определенно не самая удобная часть разработки на
Python, и уж точно не самая простая тема, к этому просто нужно привыкнуть.
Несколько раз повторил, выработал привычку — в целом, ничего сложного.
Кроме того, экосистема Python развивается очень быстро, и я надеюсь,
что скоро правильная установка пакетов
и управление виртуальными окружениями станут намного легче.
Уже сейчас можно пользоваться такими инструментами,
которые в некоторой мере прячут от пользователя виртуальные окружения:

  • poetry;
  • pipenv.

Стабильных вам зависимостей и кода без багов!

Полезно почитать:

  • Документация: https://docs.python.org/3/library/venv.html
  • Главная

  • Инструкции

  • Python

  • Как создать виртуальное окружение в Python: инструкция

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

  • Простой пример: у вас есть два приложения, которые подключаются к одной и той же библиотеке. Вот только каждому приложению нужны разные ее версии.
  • Еще пример: вы хотите обеспечить работу приложения независимо от обновлений библиотек, которые устанавливаются в глобальном хранилище Python.
  • И третий пример: у вас нет доступа к этому хранилищу.

Выход во всех трех случаях — создать venv Python. Название модуля venv — это сокращение от Virtual Environment, то есть виртуальная среда. Venv представляет собой отличный инструмент для изоляции проектов, своеобразную песочницу. В ней мы можем запускать приложение со своими зависимостями, чтобы не мешать другим приложениям, которые используют то же ПО, но иных версий. В результате каждое приложение будет запускаться в собственной виртуальной среде, изолированно от остальных, что повысит стабильность работы всех приложений.

Приятная новость: отдельно устанавливать venv на Windows нам не потребуется, пакет является частью стандартной библиотеки Python 3 и поставляется вместе с интерпретатором. 

Что касается Linux, то здесь venv далеко не всегда входит в пакет операционной системы, поэтому может потребоваться его установить. На Ubuntu/Debian это делается следующей командой:

sudo apt install -y python3-venv 

Некоторые пакеты Python требуют сборки из исходных кодов, поэтому также может потребоваться установка следующих пакетов:

sudo apt install -y build-essential libssl-dev libffi-dev python3-dev

Теперь рассмотрим, как создать виртуальное окружение Python 3 в Windows и Linux с помощью venv.

Шаг 1. Запускаем venv

Сначала идет общая команда для всех ОС:

python -m venv venv

Разберем ее чуть подробнее. Здесь -m выступает в качестве инструкции для запуска модуля venv. А вторая запись venv указывает на каталог venv/lib/python3.8/site-packages/ (номер версии 3.8 добавлен просто для примера, она может быть и другой), в котором Python будет хранить все библиотеки и другие компоненты, необходимые для изолированной работы приложений.

Шаг 2. Активируем виртуальную среду

Активация виртуального окружения выполняется по-разному для Windows и Linux. В ОС от Microsoft понадобится запустить этот скрипт:

venv\Scripts\activate.bat

А в Linux (и также в MacOS) нужно ввести вот такую инструкцию:

source venv/bin/activate

Если всё сделано правильно, будет выведена следующая запись:

(venv) root@purplegate:/var/test#

Теперь можно приступать к работе над проектом в изолированном окружении.

Другие инструменты

Конечно, venv является самым современным инструментом для создания виртуальной среды. Но он появился только в Python 3. А что делать тем, кто по каким-то причинам работает с более старыми версиями языка? Ответ: пробовать иные инструменты, которые имеют и ряд других полезных функций, иначе бы мы о них даже не упоминали. Кратко опишем эти решения, а затем рассмотрим подробнее наиболее популярное.

  • virtualenv. Простой и понятный инструмент, который пригодится при развертывании многих приложений. Поэтому он будет полезен для освоения, и ниже мы представим инструкцию по работе с ним.
  • pyenv. Позволяет изолировать версии «Питона». Полезен, если по какой-то причине вам требуется запускать разные версии Python — например, для тестирования  программы.
  • virtualenvwrapper. Обертка для virtualenv, которая используется для хранения виртуальных сред и различных операций с ними (создание, копирование, удаление). Virtualenvwrapper хорош тем, что с его помощью можно легко переключаться между средами и использовать различные плагины для расширения функций.

Создание виртуального окружения при помощи virtualenv

Рассмотрим этот процесс на примере ОС Linux. Впрочем, запуск virtualenv в Windows выполняется почти так же, разница будет лишь в путях, которые здесь будут иными, и скриптах. И это мы будем оговаривать отдельно.

Шаг 1. Устанавливаем virtualenv

Можно скачать исходники приложения и поставить его вручную, но удобнее всего сделать это с помощью менеджера pip. В этом случае всё, что вам понадобится, это ввести в консоли следующую инструкцию:

pip install virtualenv

Шаг 2. Создаем виртуальную среду

Этот шаг делается тоже при помощи всего одной небольшой инструкции:

virtualenv myenv

Эта простая команда создаст новый каталог в текущем. Разумеется, вместо myenv вы можете ввести любое другое имя для своего окружения. Теперь разберем структуру созданной директории:

  • в /myenv/bin будут размещены скрипты для работы с окружением, копия интерпретатора нужной версии, а также собственно pip и ряд приложений для пакетной обработки. Если вы работаете в Windows, то эта папка будет иметь другой адрес: /myenv/Scripts.
  • директории /myenv/lib, а также /myenv/include предназначены для хранения основных библиотек окружения. А все новые файлы будут загружаться в /myenv/lib/pythonX.X/site-packages/, где вместо X.X будет указана ваша версия «Питона».

Шаг 3. Активируем виртуальную среду

В Linux и Windows это делается немного по-разному. Для Linux инструкция такая (будем использовать всё тот же пример с именем myenv, которое вы замените на нужное вам):

source myenv/bin/activate

А вот так это будет выглядеть в Windows:

myenv\Scripts\activate.bat

При корректной активации вы увидите имя вашего виртуального окружения в нижней строке (выделили красным):

Image1

Если теперь создать виртуальную среду с ключом --system-site-packages, то вы получите доступ к общему хранилищу в рамках своей среды. Делается это так:

virtualenv --system-site-packages myenv

Обратите внимание, что путь к хранилищу в Linux и в Windows тоже будет разным: соответственно, для Линукса это будет /usr/lib/python3.8/site-packages, а для Виндовc — \Python38\Lib\site-packages. Цифры версии, опять же, для примера, у вас она может быть другой.

Шаг 4. Выходим из виртуальной среды

После завершения работы с программой из нее нужно корректно выйти. В Linux это делается командой deactivate, а в Windows с помощью «батника», пакетного файла deactivate.bat.

Что нового?

Помимо уже рассмотренного модуля venv и virtualenv, существуют и более современные инструменты, обеспечивающие более гибкое управление проектами на Python, в том числе и в виртуальном окружении:

  • Poetry. Это менеджер, позволяющий управлять зависимостями приложения в виртуальной среде. Также он облегчает тесты и развертывание приложений, автоматизируя многие вещи.
  • Pipenv. И еще один менеджер, который уже содержит в себе pip и virtualenv, а также ряд других полезных инструментов. Этот менеджер создан для облегчения управления окружениями и пакетами, ведь многие разработчики на определенной стадии развития проекта сталкиваются с проблемами из-за контроля версий.

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

Главное о Poetry

Poetry способен взять на себя всю работу с библиотеками в рамках виртуальной среды, в том числе устанавливать, обновлять и публиковать их. Например, возможностей pip для этого уже не хватит. Кроме того, создание и упаковка приложения здесь реализована при помощи всего одной команды (замените myproject на собственное название):

poetry new myproject

А, например, инструкция poetry init позволит выполнить инициализацию проекта в уже созданной директории. Вводится эта инструкция из той же директории.

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

Главное о Pipenv

Если в двух словах, то Pipenv можно охарактеризовать, как pip + virtualenv, но с продвинутыми возможностями. И на самом деле возможности этого менеджера гораздо шире. Так, он избавляет от необходимости пользоваться не слишком удобным файлом зависимостей requirements.txt.

Вместо этого в Pipenv есть два других файла, один из которых, Pipfile.lock, позволяет связывать версии библиотек, что хорошо для безопасности разрабатываемых приложений. Ну, а собственно Pipfile является продвинутой заменой устаревшему файлу требований. А дело в том, что Pipfile, в отличие от requirements.txt, обновляется автоматически с изменением версий продукта, что здорово выручает при работе в команде, избавляя разработчиков от ошибок зависимостей. Pipenv можно найти здесь.

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

  • Sound booster для windows 10 скачать торрент
  • Sp1 for windows server 2008 r2 x64
  • Soundwire для пк скачать windows 10
  • Sound blaster программа для windows 10
  • Sound blaster audigy sb0570 драйвер windows 10