[Django] 複数のPythonバージョンでの環境構築

Ubuntuのサーバーで複数のPythonをalternativesで切り替えて使っているときのDjangoの扱いについてです。Ubuntuではパッケージ管理にaptとpipの2つがありそれぞれの特徴をしっておかないとパッケージ管理が破綻します。

aptとpipの特徴

インストールパスと適応範囲

(A) sudo apt install(B) sudo pip install(C) pip install
Path/usr/lib/python3/dist-packages/usr/local/lib/python3.11/dist-packages/home/[username]/.local/lib/python3.11/site-packages/
適応範囲全てのユーザーすべてのユーザーインストールしたユーザーのみ

優先順位

利用時は(C)>(B)>(A) になります。

(A)または(B)に同じパッケージが入っている場合(C)にも入ります。

(B)に入っているパッケージと同じものを(A)に入れることはできますが、優先が(B)になるので(A)に入ったものは動作しません。(注意が必要です)

(A)に入っているものは(B)には入りません。エラーメッセージ「Requirement already satisfied」が表示されます。

インストールで混乱した経緯と考察

Djangoを使っていてパッケージをインストールしたはずなのにエラーが出たりしておかしいな?と思ったのがきっかけでPythonのバージョンやパッケージのインストールの仕組みを調べることにしました。

/usr/local/libの中にPythonのバージョン毎のディレクトリがあります。

 /usr/local/lib $ ls
python3.10  python3.11  python3.7  python3.8  python3.9

現在5つのディレクトリが存在しています。

Django関係のライブラリを適当にインストールしてみると 「/usr/local/lib/python3.10/dist-packages」の中に入っているようです。

alternativesの設定を見てみると Python3.11 が選択されています。

$ sudo update-alternatives --config python

(結果)
 Selection    Path                 Priority   Status
------------------------------------------------------------
  0            /usr/bin/python3.11   150       auto mode
  1            /usr/bin/python3.10   140       manual mode
* 2            /usr/bin/python3.11   150       manual mode
  3            /usr/bin/python3.7    110       manual mode
  4            /usr/bin/python3.8    120       manual mode
  5            /usr/bin/python3.9    130       manual mode

ターミナルで「$ python -V」「$ python –version」を実行すると共に「Python 3.11.6」と表示されます。「$ python3 -V]「$python3 –version」と実行すると共に「python 3.10.12」と表示されます。

pip install [パッケージ名]でインストールしたものは 「$python3」つまり「/usr/local/lib/python3.10/dist-packages」に入っていたようです。

$python のパス→ /usr/local/lib/python3.11/

$python3 のパス→  /usr/local/lib/python3.10/

という状態ですね。

念のため python3-pip がインストールされているか確認。

sudo apt install python3-pip
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
python3-pip is already the newest version (22.0.2+dfsg-1ubuntu0.4).

新規にインストールしてみると既にインストールされていると表示が出ました。

Pythonのバージョンに対応しているpipのバージョンも調べてみます。

$ python3.11 -m pip -V
pip 22.0.2 from /usr/lib/python3/dist-packages/pip (python 3.11)

$ python3.10 -m pip -V
pip 23.3.2 from /home/[usename]/.local/lib/python3.10/site-packages/pip (python 3.10)

Ubuntuの場合 aptとpipが利用できるため、他のLinuxディストリビューションとはpipの方法が違うようです。

$ sudo python3.11 -m pip install django==3.0.6

[sudo] password for username: 
Collecting django==3.0.6
  Using cached Django-3.0.6-py3-none-any.whl (7.5 MB)
Requirement already satisfied: pytz in /usr/lib/python3/dist-packages (from django==3.0.6) (2022.1)
Collecting asgiref~=3.2
  Using cached asgiref-3.7.2-py3-none-any.whl (24 kB)
Collecting sqlparse>=0.2.2
  Using cached sqlparse-0.4.4-py3-none-any.whl (41 kB)
Installing collected packages: sqlparse, asgiref, django
Successfully installed asgiref-3.7.2 django-3.0.6 sqlparse-0.4.4
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv

結果「/usr/local/lib/python3.11/dist-packages」の中にDjangoがインストールされました。

同様のイントール方法で他のパッケージもインストールしてみます。

$ sudo python3.11 -m pip install djangorestframework==3.11.0
$ sudo python3.11 -m pip install pymysql
$ sudo python3.11 -m pip install pillow

これで空だった「/usr/local/lib/python3.11/dist-packages」の中身が埋まり、「/usr/local/lib/python3.10/dist-packages」と同様の環境が整いました。

ターミナルで「$ python manage.py runserver」を実行すると無事Djangoが立ち上がりました。

pipでのアンインストールは以下の形式で実行できます。

$ sudo python3.11 -m pip uninstall django_cors_headers



Author: webmaster