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

newbie

Опубликован:  2018-10-16T12:10:34.274024Z

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

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

IxOYOuKiWQ.png

В полном соответствии с Python3, установка и подготовка к разработке на пакетной базе Debian stretch на этом десктопе уже установлены следующие пакеты:

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

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

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

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

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

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

(venv) newbie@stretch:~$ pip install --upgrade wheel
Collecting wheel
  Downloading https://files.pythonhosted.org/packages/fc/e9/05316a1eec70c2bfc1c823a259546475bd7636ba6d27ec80575da523bc34/wheel-0.32.1-py2.py3-none-any.whl
Installing collected packages: wheel
Successfully installed wheel-0.32.1
(venv) newbie@stretch:~$ 

Можно обновить ещё и pip.

(venv) newbie@stretch:~$ pip install --upgrade pip
Collecting pip
  Downloading https://files.pythonhosted.org/packages/c2/d7/90f34cb0d83a6c5631cf71dfe64cc1054598c843a92b400e55675cc2ac37/pip-18.1-py2.py3-none-any.whl (1.3MB)
    100% |████████████████████████████████| 1.3MB 301kB/s 
Installing collected packages: pip
  Found existing installation: pip 9.0.1
    Uninstalling pip-9.0.1:
      Successfully uninstalled pip-9.0.1
Successfully installed pip-18.1
(venv) newbie@stretch:~$ 

P3DkhjHsWL.png

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

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

(venv) newbie@stretch:~$ pip install psycopg2-binary
Collecting psycopg2-binary
  Downloading https://files.pythonhosted.org/packages/bd/30/50e9aa0193777c4a169e5606effa8cb18c7f937d462367dd3de0a9371e91/psycopg2_binary-2.7.5-cp35-cp35m-manylinux1_x86_64.whl (2.7MB)
    100% |████████████████████████████████| 2.7MB 461kB/s 
Installing collected packages: psycopg2-binary
Successfully installed psycopg2-binary-2.7.5
(venv) newbie@stretch:~$ 

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

(venv) newbie@stretch:~$ python
Python 3.5.3 (default, Sep 27 2018, 17:25:39) 
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import psycopg2
>>> psycopg2.__version__
'2.7.5 (dt dec pq3 ext lo64)'
>>> 

rJVgZiFZ2U.png

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

(venv) newbie@stretch:~$ pip uninstall psycopg2-binary
Uninstalling psycopg2-binary-2.7.5:
  Would remove:
    /home/newbie/venv/lib/python3.5/site-packages/psycopg2/*
    /home/newbie/venv/lib/python3.5/site-packages/psycopg2_binary-2.7.5.dist-info/*
Proceed (y/n)? y
  Successfully uninstalled psycopg2-binary-2.7.5
(venv) newbie@stretch:~$ 

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

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

sudo apt-get install libpq-dev

1RCPHm11vF.png

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

(venv) newbie@stretch:~$ pip install --no-binary :all: psycopg2
Collecting psycopg2
  Downloading https://files.pythonhosted.org/packages/b2/c1/7bf6c464e903ffc4f3f5907c389e5a4199666bf57f6cd6bf46c17912a1f9/psycopg2-2.7.5.tar.gz (426kB)
    100% |████████████████████████████████| 430kB 712kB/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.5
(venv) newbie@stretch:~$ 

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

(venv) newbie@stretch:~$ python
Python 3.5.3 (default, Sep 27 2018, 17:25:39) 
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import psycopg2
>>> psycopg2.__version__
'2.7.5 (dt dec pq3 ext lo64)'
>>> 

eLNWQp6XsT.png

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

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

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

LTw7s2GMjd.png

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

psycopg2==2.7.5 --no-binary psycopg2

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

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

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

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

Обновляю wheel.

(venv) newbie@stretch:~$ pip install --upgrade wheel
Collecting wheel
  Downloading https://files.pythonhosted.org/packages/fc/e9/05316a1eec70c2bfc1c823a259546475bd7636ba6d27ec80575da523bc34/wheel-0.32.1-py2.py3-none-any.whl
Installing collected packages: wheel
Successfully installed wheel-0.32.1
(venv) newbie@stretch:~$ 

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

(venv) newbie@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.5 (from -r requirements.txt (line 2))
  Cache entry deserialization failed, entry ignored
  Cache entry deserialization failed, entry ignored
  Downloading https://files.pythonhosted.org/packages/b2/c1/7bf6c464e903ffc4f3f5907c389e5a4199666bf57f6cd6bf46c17912a1f9/psycopg2-2.7.5.tar.gz (426kB)
    100% |████████████████████████████████| 430kB 621kB/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.5
(venv) newbie@stretch:~$ 

yhzGIPRCWt.png

Успех! С использованием файла requirements.txt пакет psycopg2 установился корректно. В общем-то цель достигнута, можно приступать к разработке web-приложений с базой данных PostgreSQL, но это тема для отдельного разговора.

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