Python: установка virtualenv

Виртуальное окружение virtualenv — это инструмент, позволяющий создавать изолированные среды для отдельных проектов Python, решая тем самым проблему зависимостей и совместимости приложений разных версий. Подробнее о виртуальном окружении Python можно прочитать в официальной документации.

После установки virtualenv вы можете использовать pip для установки библиотек Python.

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

Версии Python

По умолчанию на наших серверах доступны версии Python 2 и Python 3.6, но вы также можете использовать версию Python 3.5.

Проверить версии Python на сервере можно с помощью команд:

# Версии Python 2:
python -V

# Версии Python 3:
python3 -V

Версии Python обратно совместимы, то есть приложение, написанное на 3.6, скорее всего, будет работать под 3.7, и так далее. Однако не всегда код, написанный на новых версиях, будет корректно работать на старых версиях из-за возможного нового синтаксиса и функций языка. Также обратите внимание, что Python 2 и Python 3 несовместимы между собой.

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

# Если требуется Python2:
python virtualenv.pyz venv

# Если требуется Python3.5:
python3.5 virtualenv.pyz venv

# Если требуется Python3.6:
python3.6 virtualenv.pyz venv

Таким образом, при выполнении команды:

python3 virtualenv.pyz venv

окружение будет содержать интерпретатор Python3. Если вам нужна версия 2, то необходимо вызывать python:

python virtualenv.pyz venv

Обратите внимание, что в виртуальном окружении доступна только та версия Python 3, которая была выбрана при создании виртуального окружения. Например, запустить скрипт через Python 3.5 в виртуальном окружении, созданном через Python 3.6, не получится:

(env) $ python3.5 --version
Command 'python3.5' not found

При этом Python 2 будет доступен:

(env) $ python2 --version
Python 2.7.17

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

(env) $ python --version
Python 3.6.9

Установка в корень аккаунта

Установить одну из последних версий виртуального окружения в корень аккаунта можно по инструкции ниже.

  1. Скачать virtualenv, указав в команде нужную версию Python.
wget https://bootstrap.pypa.io/virtualenv/X.X/virtualenv.pyz

Например, для Python 3.6:

wget https://bootstrap.pypa.io/virtualenv/3.6/virtualenv.pyz
  1. Создать виртуальное окружение, используя нужную версию Python. Например:
# Если требуется Python3:
python3 virtualenv.pyz venv

# Если требуется Python2:
python virtualenv.pyz venv

При этом будет создана директория venv, из которой будет запускаться виртуальное окружение (имя директории можно задать любое).

  1. Активировать виртуальное окружение:
source venv/bin/activate

Далее вы можете приступить к установке библиотек с помощью pip. После отключить виртуальное окружение можно командой deactivate.

Установка в конкретный каталог

Если виртуальное окружение требуется для конкретного сайта, можно установить его в соответствующий каталог public_html:

  1. Перейти в нужный каталог (вместо u и user укажите первую букву логина и сам логин):
cd /home/u/user/директория_сайта/public_html
  1. Скачать virtualenv, указав нужную версию Python:
wget https://bootstrap.pypa.io/virtualenv/X.X/virtualenv.pyz

Например, для Python 3.6:

wget https://bootstrap.pypa.io/virtualenv/3.6/virtualenv.pyz
  1. Создать виртуальное окружение, используя нужную версию Python. Например:
# Если требуется Python 3:
python3 virtualenv.pyz venv

# Если требуется Python 2:
python virtualenv.pyz venv

При этом будет создана директория venv, из которой будет запускаться виртуальное окружение (имя директории можно задать любое).

  1. Активировать виртуальное окружение (вместо u и user укажите первую букву логина и сам логин):
source /home/u/user/директория_сайта/public_html/venv/bin/activate

Далее вы можете приступить к установке библиотек с помощью pip. После отключить виртуальное окружение можно командой deactivate.

Использование PIP

PIP — система управления пакетами для установки и управления программными пакетами на Python. 

Основные команды pip

# Установка пакета
pip install имя_пакета

# Обновление пакета
pip install -U имя_пакета

# Удаление пакета
pip uninstall имя_пакета — удаление пакета

# Вывод установленных пакетов
pip freeze

# Просмотр версии pip
pip --version

# Обновление pip
pip install -U pip

Файл requirements.txt

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

Пример содержимого requirements.txt:

asgiref==3.4.1
Django==3.2.7
pytz==2021.1
sqlparse==0.4.2
typing-extensions==3.10.0.2

где:

  • Django — имя пакета;
  • 3.2.7 — версия пакета.

Вместо обозначения == может встретиться >=, что означает версию равную или выше.

Восстановление виртуального окружения с помощью requirements.txt

С помощью requirements.txt можно выполнить рекурсивную установку пакетов. В этом случае нет необходимости устанавливать пакеты вручную.

Выполнить установку можно командой:

pip install -r requirements.txt

Возможные ошибки

No module named 'имя_модуля'

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

plain.webtm.ru [Tue Jul 07 06:18:52 2020] [error] [pid 74988] src/server/wsgi_logger.c(147): [client 5.16.118.157:33342] import pygame
plain.webtm.ru [Tue Jul 07 06:18:52 2020] [error] [pid 74988] src/server/wsgi_logger.c(147): [client 5.16.118.157:33342] ModuleNotFoundError: No module named 'pygame'

Если вы уверены, что модуль установлен, но ошибка все равно возникает, необходимо проверить корректность путей в файле index.wsgi и указать в скрипте корректный путь до интерпретатора Python.

Например, если виртуальное окружение было установлено в директорию /mysite/public_html, в начало скрипта необходимо добавить строку:

#!/home/u/user/mysite/public_html/venv/bin/python3.6

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

Target WSGI script '/путь/до/скрипта/index.wsgi' cannot be loaded as Python module

Возникает при неправильной настройке файла index.wsgi.

Необходимо сверить файл с инструкциями по ссылкам: Django, Flask.

DisallowedHost at / Invalid HTTP_HOST header

Для устранения ошибки необходимо указать доменное имя в качестве переменной в файле /имя_проекта/settings.py, например:

ALLOWED_HOSTS = ['example.com']

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

ALLOWED_HOSTS = ['*']

AttributeError: module 'MySQLdb.constants.FIELD_TYPE' has no attribute 'JSON'

Необходимо обновить mysqlclient командой:

pip install -U mysqlclient

The SECRET_KEY setting must not be empty

Нужно проверить корректность указанного имени модуля настроек в wsgi-скрипте или наличие SECRET_KEY в файле settings.py.

Пример сообщения об ошибке в логе:

Jan 28 02:12:27 vh328 apache_error[58945]: ce05390-django.tw1.ru [Thu Jan 28 02:12:27 2021] [error] [pid 35894] src/server/wsgi_logger.c(147): [client 188.163.65.63:37230] django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.