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のバージョン毎のディレクトリがあります。
0 1 2 3 |
/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 が選択されています。
0 1 2 3 4 5 6 7 8 9 10 11 12 |
$ 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 がインストールされているか確認。
0 1 2 3 4 5 6 |
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のバージョンも調べてみます。
0 1 2 3 4 5 6 |
$ 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の方法が違うようです。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ 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がインストールされました。
同様のイントール方法で他のパッケージもインストールしてみます。
0 1 2 3 4 |
$ 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