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