[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のバージョン毎のディレクトリがあります。

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

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

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

ターミナルで「$ 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 がインストールされているか確認。

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

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

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

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

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

これで空だった「/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