はじめに
自分も Python を使い始めました。記事を見ていると pyenv や venv を使って書かれていることがあります。
それらのコマンドを説明している記事は多いのですが、それを実行すると「何が起きているのか」説明している記事はほぼありません。そこに着目して調べてみました。
素の Python を使う
例えば Ubuntu Linux は、標準で Python がインストールされています。OS 自身の機能のためですね。
Python 環境のインストール場所を確認してみます。Google Compute Engine で作成した Ubuntu Linux 22.4.5 の場合、
-
python3コマンドは/usr/bin/python3です。これは/usr/bin/python3.10へのリンクでした。 - python コマンドが参照するライブラリは、
/usr/bin/python3.10ディレクトリにあります。 - pip でインストールしたパッケージは
/usr/lib/python3/dist-packages/に入ります。
上記の通り Ubuntu 22.4.5 にインストールされているのは Python 3.10 でした。例えば Python 3.11 を利用したいときはどうしたらいいでしょうか。
$ sudo apt install 3.11
OS のパッケージマネージャを使って別のバージョンの Python をインストールすればよさそうです。↑
-
python3コマンドは/usr/bin/python3で、/usr/bin/python3.11へのリンクになりました。 - python コマンドが参照するライブラリは、
/usr/bin/python3.11ディレクトリにあります。 - pip でインストールしたパッケージは
/usr/lib/python3/dist-packages/に入ります。
Python 3.10 は残っていますが、python3 コマンドは Python 3.11 に切替わります。Python 3.10 は OS 自体の機能のためにインストールされていました。Python 3.11 にしてしまって問題ないでしょうか。
pyenv を使う
既存の Python 環境を残して、別のバージョンの Python をインストールして切替して利用するのに、pyenv を利用できます。
pyenv/pyenv: Simple Python version management
公式サイトで指示された手順でインストールします。さらにインストール先にパスを通しておきます。
pyenv は /home/(ユーザ名)/.pyenv にインストールされます。
以下のコマンドで別のバージョンの Python をインストールできます。
$ pyenv install (バージョン番号)
-
pythonコマンドは/home/(ユーザ名)/.pyenv/versions/(バージョン番号)/bin/pythonで、/home/(ユーザ名)/.pyenv/versions/(バージョン番号)/bin/python(バージョン番号)へのリンクです。 - python コマンドが参照するライブラリは、
/home/(ユーザ名)/.pyenv/versions/(バージョン番号)/lib/ディレクトリにあります。 - pip でインストールしたパッケージは
/home/(ユーザ名)/.pyenv/versions/(バージョン番号)/lib/python(バージョン番号)/site-packages/に入ります。
上記の手順で別のバージョンの Python をインストールしましたが、このまま python コマンドを実行すると従来の Python が呼出されます。
追加したバージョンの Python を有効にする設定します。↓
$ pyenv global (バージョン番号)
-
/home/(ユーザ名)/.pyenv/versionファイルにバージョン番号がセットされます。 -
pythonコマンドで/home/(ユーザ名)/.pyenv/versions/(バージョン番号)/bin/pythonが実行されるようになります。
OS 全体で切替するのでなく、特定のプロジェクトで特定のバージョンの Python を使いたいときがあります。そのプロジェクトのディレクトリに移動して、特定のバージョンを有効にする設定します。↓
$ pyenv local (バージョン番号)
- そのディレクトリに
.python-versionファイルが作成されてバージョン番号がセットされます。 -
pythonコマンドで/home/(ユーザ名)/.pyenv/versions/(バージョン番号)/bin/pythonが実行されるようになります。
pyenv がインストールされた環境では、python コマンドを実行したとき
①カレントディレクトリに .python-version ファイルがあれば、その設定に従う
②それがなければ、/home/(ユーザ名)/.pyenv/version があれば、その設定に従う
③それもなければ、素の Python が呼出される
venv を使う
pyenv を使うと、使用する Python のバージョンをプロジェクトごとに指定できるようになります。そのとき pip でインストールしたパッケージは、使用しているバージョンの Python 環境にインストールされます。
インストールするパッケージのバージョンを、プロジェクトごとに指定したいときは、venv が使えます。
venv は、バージョン 3.3 以降の Python の機能です。
以下のコマンドで「仮想環境」を作ります。
$ python -m venv (仮想環境名)
上記のコマンドを実行したディレクトリに、指定した仮想環境名のディレクトリが作成されます。
-
pythonコマンドは(仮想環境のディレクトリ)/bin/pythonです。これは上記のコマンドを実行した時点の python コマンドへのリンクです。 - python コマンドが参照するライブラリは、リンク先の Python 環境です。
- pip でインストールしたパッケージは
(仮想環境のディレクトリ)/lib/site-packages/に入ります。
上記の手順で「仮想環境」を作成しましたが、python コマンドを実行したとき従来の Python 環境が参照されます。
作成した「仮想環境」を有効にする設定します。↓
$ source (仮想環境のディレクトリ)/bin/activate
指定した仮想環境のディレクトリにパスが通され、優先されるようになります。どこのディレクトリで python コマンドを実行しても、上記で指定された「仮想環境」が参照されます。ターミナルソフトのプロンプトが変わります。↓
(仮想環境名) $
プロジェクトごとのディレクトリに「仮想環境」を作成してもいいでしょう。プロジェクトのディレクトリに移動して
$ python -m venv .venv
上記のコマンドを実行したディレクトリに、.venv ディレクトリが作成されます。
以下のコマンドで「仮想環境」が有効になります。
$ .venv/bin/activate
このとき、プロジェクトのディレクトリから別のディレクトリに移動すると、仮想環境が無効になるといいのですが、そうはなりません。pyenv と挙動が違いますね。
「仮想環境」を無効にするには
(仮想環境名) $ deactivate
pipenv を使う
pyenv と venv を使って、Python のバージョンとパッケージを管理できました。これと別の環境管理ツール pipenv を使っている記事がありました。
pypa/pipenv: Python Development Workflow for Humans.
公式サイトで指示された手順でインストールします。
pipenv は Python のパッケージとしてインストールするようです。
プロジェクトのディレクトリに移動して、以下のコマンドで「仮想環境」を作成します。
$ pipenv install
そのディレクトリに Pipfile と Pipfile.lock ファイルが作成されます。
加えて /home/(ユーザ名)/.local/share/virtualenvs/(プロジェクト名)/ フォルダが作成されます。
上記のコマンドを実行した時点のバージョンの Python が、仮想環境で使用されるよう記録されます。
特定のバージョンの Python を指定して仮想環境を作成するには
$ pipenv install --python (バージョン番号)
インストール済の Python を選択できます。インストール済でないバージョンを指定するとエラーになりますが、pyenv が導入されていれば呼出して指定したバージョンをインストールするようです。
-
pythonコマンドは/home/(ユーザ名)/.local/share/virtualenvs/(プロジェクト名)/bin/pythonで、既存の Python へのリンクです。 - python コマンドが参照するライブラリは、リンク先の Python 環境です。
以下のコマンドでパッケージをインストールします。
$ pipenv install (パッケージ名)
- パッケージは
/home/(ユーザ名)/.local/share/virtualenvs/(プロジェクト名)/lib/python(バージョン番号)/site-packages/に入ります。
pipenv で「仮想環境」を作成しましたが、python コマンドを実行したとき従来の Python 環境が参照されます。
作成した「仮想環境」を有効にする設定します。↓
$ pipenv shell
指定した仮想環境のディレクトリにパスが通され、優先されるようになります。どこのディレクトリで python コマンドを実行しても、上記で指定された「仮想環境」が参照されます。ターミナルソフトのプロンプトが変わります。↓
(仮想環境名) $
指定した「仮想環境」を無効にするには
(仮想環境名) $ exit
仮想環境の有効化しないで、プロジェクトのディレクトリで、以下の要領でコマンドを実行することもできます。
$ pipenv run (コマンド)
uv を使う
pyenv と venv または pipenv で十分そうですが、uv がいいと言われているようです。
GitHub - astral-sh/uv: An extremely fast Python package and project manager, written in Rust.
公式サイトで指示された手順でインストールします。
uv は /home/(ユーザ名)/.local/bin にインストールされます。pip でインストールすることもできるようです。
以下のコマンドで別のバージョンの Python をインストールできます。pyenv と似ています。
$ uv python install (バージョン番号)
-
pythonコマンドは/home/(ユーザ名)/.local/share/uv/python/(パッケージ名)/bin/pythonで、/home/(ユーザ名)/.local/share/uv/python/(パッケージ名)/bin/python(バージョン番号)へのリンクです。 - python コマンドが参照するライブラリは、
/home/(ユーザ名)/.local/share/uv/python/(パッケージ名)/lib/ディレクトリにあります。
上記の手順で別のバージョンの Python をインストールしましたが、このままで python コマンドを実行すると従来の Python が呼出されます。
プロジェクトのディレクトリに移動して、以下のコマンドで「仮想環境」を作成します。
$ uv venv
上記のコマンドを実行したディレクトリに、.venv ディレクトリが作成されます。venv と同じですね。
あるいは、プロジェクトを作成したいディレクトリに移動して、以下のコマンドで「プロジェクト」を作成します。
$ uv init (プロジェクト名)
指定したプロジェクト名のディレクトリが作成され、そのディレクトリに pyproject.toml ファイルなどが作成されます。pipenv に似ています。
上記のコマンドを実行した時点のバージョンの Python が、仮想環境で使用されるよう記録されます。
特定のバージョンの Python を指定して仮想環境を作成するには
$ uv venv --python (バージョン番号)
あるいは
$ uv init (プロジェクト名) --python (バージョン番号)
指定したディレクトリに .python-version ファイルが作成されてバージョン番号がセットされます。pyenv と同じですね。
「仮想環境」にパッケージをインストールするには
$ uv add (パッケージ名)
- パッケージは
(プロジェクトのディレクトリ)/.venv/lib/python(バージョン番号)/site-packages/に入ります。
「仮想環境」を有効にしないと、指定したバージョンの Python や、追加したパッケージが使用できません。venv と同じですね。
pipenv のように、仮想環境の有効化しないで、プロジェクトのディレクトリで、以下の要領でコマンドを実行することもできます。
$ uv run (ソースファイル)
あるいは
$ uv run (コマンド)
ツールを比較する
上記のツールの仕様の一部を比較してみます。
| ツール | 追加される Python の場所 | プロジェクトの仮想環境の有効化 | 仮想環境を有効化しないで | パッケージが入る場所 |
|---|---|---|---|---|
| pyenv | /home/(ユーザ名)/.pyenv/versions/(バージョン番号)/ | なし | なし | /home/(ユーザ名)/.pyenv/versions/(バージョン番号)/lib/python(バージョン番号)/site-packages/ |
| venv | なし | $ (プロジェクトのディレクトリ)/.venv/bin/activate | なし | (プロジェクトのディレクトリ)/.venv/lib/site-packages/ |
| pipenv | pyenv を使う | $ pipenv shell | $ pipenv run (コマンド) | /home/(ユーザ名)/.local/share/virtualenvs/(プロジェクト名)/lib/python(バージョン番号)/site-packages |
| uv | /home/(ユーザ名)/.local/share/uv/python/(パッケージ名)/ | venv と同じ | $ uv run (コマンド) | (プロジェクトのディレクトリ)/.venv/lib/python(バージョン番号)/site-packages/ |