Django

【Python】Ubuntu18.04でpsycopg2がインストールできない問題の解決法

WSL2上のUbuntu18.04にて、django-herokuをインストールしようとしたらトラブったので、解決法をまとめておきます。
関係ない解決法を紹介している記事が多くて、絶妙にググラビティが低かったので手間取りました笑

もくじ

  1. 環境
  2. エラーの原因
  3. libpq-devについて
  4. まとめ

環境

今回の環境は以下の通りです。

・WSL2のUbuntu18.04ディストリビューション
・pipenv仮想環境
・Python 3.6.8

その他は初期設定のままです。
Ubuntuのupdateとupgradeはしてありました。

エラーの原因

まず、インストール時のエラー表示はこんな感じでした。

$ pip install django-heroku
Collecting django-heroku
  Using cached https://files.pythonhosted.org/packages/59/af/5475a876c5addd5a3494db47d9f7be93cc14d3a7603542b194572791b6c6/django_heroku-0.3.1-py2.py3-none-any.whl
Collecting whitenoise (from django-heroku)
  Using cached https://files.pythonhosted.org/packages/96/75/92afb2d8912ac19646f67a2c69bb8683e5aab78db3b0791bfd3e7ed022bb/whitenoise-4.1.3-py2.py3-none-any.whl
Collecting psycopg2 (from django-heroku)
  Using cached https://files.pythonhosted.org/packages/5c/1c/6997288da181277a0c29bc39a5f9143ff20b8c99f2a7d059cfb55163e165/psycopg2-2.8.3.tar.gz
    ERROR: Command errored out with exit status 1:
     command: /home/yuki/.local/share/virtualenvs/mini-bot-api-G6oo3JJj/bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-_3jwh38b/psycopg2/setup.py'"'"'; __file__='"'"'/tmp/pip-install-_3jwh38b/psycopg2/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'rn'"'"', '"'"'n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base pip-egg-info
         cwd: /tmp/pip-install-_3jwh38b/psycopg2/
    Complete output (7 lines):
    running egg_info
    creating pip-egg-info/psycopg2.egg-info
    writing pip-egg-info/psycopg2.egg-info/PKG-INFO
    writing dependency_links to pip-egg-info/psycopg2.egg-info/dependency_links.txt
    writing top-level names to pip-egg-info/psycopg2.egg-info/top_level.txt
    writing manifest file 'pip-egg-info/psycopg2.egg-info/SOURCES.txt'
    Error: b'You need to install postgresql-server-dev-X.Y for building a server-side extension or libpq-dev for building a client-side application.n'
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

django-herokuって、複数のモジュールをまとめてインポートするみたいなんですが、どうやらエラーの原因はpsycopg2のインストールのようです。
試しに、psycopg2を個別にインポートしようとしても、同様のエラーが発生しました。

原因に関してですが、普通に書いてありましたね。
全然気づきませんでした。

ググる前にちゃんと読めという笑

原因、こちらでした。

Error: b'You need to install postgresql-server-dev-X.Y for building a server-side extension or libpq-dev for building a client-side application.n'

要するに、postgresql-server-dev-X.Yかlibpq-devが不足してるよ、って話でした。

そこで、libpq-devをaptでインストールしたところ無事に解決。

sudo apt install libpq-dev

libpq-devについて

libpq-devとは何者なのでしょうか?
ちょっと調べてみました。

libpq-devとは、PostgreSQLデータベースバックエンドと通信するために、libpqライブラリとリンクするCプログラムをコンパイルするためのヘッダーファイルと静的ライブラリ、だそうです。
ソースはDebian公式。
パッケージ: libpq-dev (11.5-1 など)

なんのこっちゃって感じですが、そもそもpsycopg2はPythonでPostgreを操作するためのモジュールですが、直接SQLとやり取りをするわけではなく、libpq-devを通して通信をしているという感じなのでしょう。
余裕があればライブラリの中身を見てみるのも面白いかもしれませんね。

まとめ

とりあえず今回は無事に解決しました。
setuptoolというものの不足が原因だ、とかPosgreをインストールしておかないとだめだとか、いろいろな説があって混乱しましたが、結局はエラーログちゃんと読めって話でしたね。

これもまた勉強です。

追記(2020年10月2日)

以前は上記の内容でpsycopg2をインストールできていたのですが、先日試したところ、下記のようなエラーが出ました。

    ./psycopg/psycopg.h:34:10: fatal error: Python.h: No such file or directory
     #include <Python.h>
              ^~~~~~~~~~
    compilation terminated.
    
    It appears you are missing some prerequisite to build the package from source.
    
    You may install a binary package by installing 'psycopg2-binary' from PyPI.
    If you want to install psycopg2 from source, please install the packages
    required for the build and try again.
    
    For further information please check the 'doc/src/install.rst' file (also at
    <http://initd.org/psycopg/docs/install.html>).
    
    error: command 'x86_64-linux-gnu-gcc' failed with exit status 1

どうやら、python3-devパッケージがないとこのようなエラーが出るようなのですが、僕の環境にはpython3-devがインストールされていました。

しかし、よくよく見ると、僕が使っているのはPython3.8にもかかわらず、python3-devパッケージはPython3.6.xしかサポートしていないように見えます。

python3-dev is already the newest version (3.6.7-1~18.04).

そこで、以下のコマンドでpython3.8-devパッケージをインストール。

sudo apt install  python3.8-dev

これでまた無事にUbuntu上にpsycopg2をインストールすることができるようになりました。

COMMENT

メールアドレスが公開されることはありません。