はじめに
自分も 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/ |