Debian stretch и Python3, установка psycopg2 в виртуальное окружение

avm

Опубликован:  2018-03-06T05:09:23.739610Z
600

В web-разработке для хранения и обработки данных часто используется база данных PostgreSQL. Взаимодействие с этой базой данных в коде Python3 обычно осуществляется при помощи специального адаптера - библиотеки psycopg2. Установка этой библиотеки в виртуальное окружение имеет характерные особенности. Об этом и пойдёт речь ниже.

Для этой демонстрации у меня есть настроенный LXDE-десктоп с Debian stretch на борту, имеющий безлимитное соединение с сетью Интернет. В полном соответствии с Python3, установка и подготовка к разработке на пакетной базе Debian stretch на этом десктопе установлены следующие пакеты:

  • python3-dev;
  • python3-venv;
  • python3-pip;
  • gcc.

Адаптер psycopg2 в сущности своей является обычным пакетом и может быть установлен из PyPI при помощи pip. Документация доступна на странице psycopg2. Устанавливать эту библиотеку я буду в виртуальное окружение. Для этого создаю его.

sadmin@stretch:~$ python3 -m venv venv
sadmin@stretch:~$ 

Активирую.

sadmin@stretch:~$ source venv/bin/activate
(venv) sadmin@stretch:~$ 

Перед установкой дополнительных пакетов в это виртуальное окружение необходимо обновить wheel.

(venv) sadmin@stretch:~$ pip install --upgrade wheel
Collecting wheel
  Downloading wheel-0.30.0-py2.py3-none-any.whl (49kB)
    100% |████████████████████████████████| 51kB 287kB/s 
Installing collected packages: wheel
Successfully installed wheel-0.30.0
(venv) sadmin@stretch:~$ 

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

Устанавливаю psycopg2 с готовыми бинарными файлами.

(venv) sadmin@stretch:~$ pip install psycopg2-binary
Collecting psycopg2-binary
  Downloading psycopg2_binary-2.7.4-cp35-cp35m-manylinux1_x86_64.whl (2.7MB)
    100% |████████████████████████████████| 2.7MB 283kB/s 
Installing collected packages: psycopg2-binary
Successfully installed psycopg2-binary-2.7.4
(venv) sadmin@stretch:~$ 

Пакет установлен и готов к использованию.

(venv) sadmin@stretch:~$ python
Python 3.5.3 (default, Jan 19 2017, 14:11:04) 
[GCC 6.3.0 20170118] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import psycopg2
>>> psycopg2.__version__
'2.7.4 (dt dec pq3 ext lo64)'
>>> 

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

(venv) sadmin@stretch:~$ pip uninstall psycopg2-binary

В процессе удаления pip запросит согласие на удаление пакета, нужно ввести Y и дождаться завершения процесса.

Для установки psycopg2 с компиляцией бинарных файлов непосредственно в момент установки потребуется установить дополнительно один пакет - libpq-dev. Установить его можно из официального репозитория при помощи apt-get или aptitude.

(venv) sadmin@stretch:~$ sudo aptitude install libpq-dev
Следующие НОВЫЕ пакеты будут установлены:        
  libpq-dev 
0 пакетов обновлено, 1 установлено новых, 0 пакетов отмечено для удаления, и 0 пакетов не обновлено.
Необходимо получить 212 kБ архивов. После распаковки 1 020 kБ будет занято.
Получить: 1 http://deb.debian.org/debian stretch/main amd64 libpq-dev amd64 9.6.6-0+deb9u1 [212 kB]
Получено 212 kБ в 0с (336 kБ/с)
Выбор ранее не выбранного пакета libpq-dev.
(Чтение базы данных … на данный момент установлено 146002 файла и каталога.)
Подготовка к распаковке …/libpq-dev_9.6.6-0+deb9u1_amd64.deb …
Распаковывается libpq-dev (9.6.6-0+deb9u1) …
Настраивается пакет libpq-dev (9.6.6-0+deb9u1) …
Обрабатываются триггеры для man-db (2.7.6.1-2) …

(venv) sadmin@stretch:~$ 

Теперь используя стандартную опцию pip --no-binary можно установить psycopg2. Установка займёт более продолжительное время.

(venv) sadmin@stretch:~$ pip install --no-binary :all: psycopg2
Collecting psycopg2
  Downloading psycopg2-2.7.4.tar.gz (425kB)
    100% |████████████████████████████████| 430kB 1.3MB/s 
Skipping bdist_wheel for psycopg2, due to binaries being disabled for it.
Installing collected packages: psycopg2
  Running setup.py install for psycopg2 ... done
Successfully installed psycopg2-2.7.4
(venv) sadmin@stretch:~$ 

Пакет готов к использованию.

(venv) sadmin@stretch:~$ python
Python 3.5.3 (default, Jan 19 2017, 14:11:04) 
[GCC 6.3.0 20170118] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import psycopg2
>>> psycopg2.__version__
'2.7.4 (dt dec pq3 ext lo64)'
>>> 

В завершении темы хотелось бы остановиться на создании файла requirements.txt. Поскольку psycopg2 установлен нестандартным способом, это следует отразить в файле, при помощи которого виртуальное окружение будет восстанавливаться. Создаю файл requirements.txt.

(venv) sadmin@stretch:~$ pip freeze > requirements.txt
(venv) sadmin@stretch:~$ 

Открываю этот файл в текстовом редакторе.

requirements.txt

Последнюю строчку этого файла, которая имеет вид psycopg2==2.7.4 редактирую и привожу к следующему виду.

psycopg2==2.7.4 --no-binary psycopg2

Сохраняю файл и выхожу из текстового редактора. Для подтверждения гипотезы деактивирую и удаляю виртуальное окружение.

(venv) sadmin@stretch:~$ deactivate
sadmin@stretch:~$ rm -rf venv
sadmin@stretch:~$ 

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

sadmin@stretch:~$ python3 -m venv venv
sadmin@stretch:~$ source venv/bin/activate
(venv) sadmin@stretch:~$ 

Обновляю wheel.

(venv) sadmin@stretch:~$ pip install --upgrade wheel
Collecting wheel
  Using cached wheel-0.30.0-py2.py3-none-any.whl
Installing collected packages: wheel
Successfully installed wheel-0.30.0
(venv) sadmin@stretch:~$ 

Устанавливаю пакеты из файла requirements.txt.

(venv) sadmin@stretch:~$ pip install -r requirements.txt 
Requirement already satisfied: pkg-resources==0.0.0 in ./venv/lib/python3.5/site-packages (from -r requirements.txt (line 1))
Collecting psycopg2==2.7.4 (from -r requirements.txt (line 2))
  Using cached psycopg2-2.7.4.tar.gz
Skipping bdist_wheel for psycopg2, due to binaries being disabled for it.
Installing collected packages: psycopg2
  Running setup.py install for psycopg2 ... done
Successfully installed psycopg2-2.7.4
(venv) sadmin@stretch:~$ 

Успех! Пакет psycopg2 установился корректно. Это всё, о чём я хотел поведать миру сегодня. :) Вопросы и предложения можно сформулировать в комментариях, чтобы оставить комментарий следует обновить страницу и после этого нажать синюю кнопку ниже в строчке Комментарии:.

 
Комментарии: