venv で Python の分離環境をつくる

venv とはなにか?

Python に同梱されているモジュール(ツール)。公式の説明では、「venv モジュールは、軽量仮想環境の作成ができます。」とありますが、通常のPython 利用とは別に特定環境用に Python の分離環境を利用できると理解するとよいと思います。

The venv module supports creating lightweight “virtual environments”

https://docs.python.org/3/library/venv.html

Python にはじめから同梱されているため、あらためてインストールしなくとも利用できます。

venv のつかいかた

venv の使いかたは、カンタン。以下の3つを理解すれば、実際の利用に困ることはありません。

  • venv の利用環境のセットアップ

  • venv の開始

  • venv の終了

それでは、具体的に使いかたをみてみましょう。

$ mkdir {ProjectDirectory}
$ cd {ProjectDirectory}
$ pwd
/home/{HomeDirectory}/{ProjectDirectory}
$ python --version
Python 3.11.2
$ python -m venv .venv
$ ls -a
.  ..  .venv

venvを利用する場所(ディレクトリ)を作成・移動します。

$ mkdir {ProjectDirectory}               # ディレクトリの作成
$ cd {ProjectDirectory}                  # ディレクトリへの移動
$ pwd                                    # 現在のディレクトリ位置の確認
/home/{HomeDirectory}/{ProjectDirectory}

このディレクトリ内に、利用する Python(のシンボリックリンク)や pip で今後、追加するモジュール、ライブラリがすべてインストールされます。
そのため、このディレクトリごと、ほかの場所に移動・コピーをしても、同じように利用することができます。(これが分離環境といった意味です。)
また、pip のモジュール管理でもモジュールが専用の場所に格納されているため、余計なモジュールが紛れ込むことやバージョンのバッティングなどもありません。requirements.txt の利用もシンプルになります。

venv による分離環境の作成

$ python --version               # pythonバージョンの確認
Python 3.11.2
$ python -m venv .venv           # venvによる分離環境の作成
$ ls -a                          # 作成されたことを確認
.  ..  .venv

この例では、".venv" と名前をつけておりますが、この ".venv" の名前は、分離環境の各種ファイル(設定ファイルやPython本体(のシンボリックリンク)、モジュールなど)を収めるためのディレクトリの名称の意味しかありませんので、実際にはどのような名前でも問題ありません。
venv モジュールの説明に「一般的にターゲットディレクトリ名には、.venvが使われます。」とあったので、利用したに過ぎません。

a common name for the target directory is .venv

https://docs.python.org/3/library/venv.html

venvの開始

それでは、venvを開始していきます。今後、このディレクトリ内で「 Python のコードを書く」や「実行する」の前に、このコマンドを実行してから、様々な操作をします。

$ ls .venv/bin
Activate.ps1  activate.csh   pip   pip3.11  python3
activate      activate.fish  pip3  python   python3.11
$ which python
/home/{HomeDirectory}/.pyenv/shims/python
$ python -m pip show pip
Name: pip
Version: 22.3.1
Summary: The PyPA recommended tool for installing Python packages.
Home-page: https://pip.pypa.io/
Author: The pip developers
Author-email: distutils-sig@python.org
License: MIT
Location: /home/{HomeDirectory}/.pyenv/versions/3.11.2/lib/python3.11/site-packages
Requires: 
Required-by: 
$ python -m pip list
Package    Version
---------- -------
pip        22.3.1
setuptools 65.5.0

[notice] A new release of pip available: 22.3.1 -> 23.0.1
[notice] To update, run: pip install --upgrade pip
$ source .venv/bin/activate
(.venv) $ 
(.venv) $ which python
/home/{HomeDirectory}/{ProjectDirectory}/.venv/bin/python
(.venv) $ python -m pip show pip
Name: pip
Version: 22.3.1
Summary: The PyPA recommended tool for installing Python packages.
Home-page: https://pip.pypa.io/
Author: The pip developers
Author-email: distutils-sig@python.org
License: MIT
Location: /home/{HomeDirectory}/{ProjectDirectory}/.venv/lib/python3.11/site-packages
Requires: 
Required-by: 
(.venv) $ python -m pip list
Package    Version
---------- -------
pip        22.3.1
setuptools 65.5.0

[notice] A new release of pip available: 22.3.1 -> 23.0.1
[notice] To update, run: pip install --upgrade pip

venv の開始には、activate というシェルスクリプトを使用します。

activate スクリプトは、venv コマンドで分離環境を作成した際に作成したディレクトリ内にインストールされています。下記の例では、.venv/bin ディレクトリにいくつかの activate スクリプトがあることがわかります。

$ ls .venv/bin
Activate.ps1  activate.csh   pip   pip3.11  python3
activate      activate.fish  pip3  python   python3.11

それぞれ、使用するシェル環境用にコマンドが用意されています。

  • Activate.ps1 PowerShell (POSIX) 用スクリプト

    • 現在の PowerShell は、Windows 以外のプラットフォームでも動作します。このスクリプトは、それら POSIX 環境(MacOS, Linuxなど)での PowerShell 上で利用するためのスクリプトです。WIndows 環境用には、このスクリプトとは別のスクリプトが用意されます。

  • activate.csh csh, tcsh 用スクリプト

  • activate.fish fish 用スクリプト

  • activate   bash, zsh 用スクリプト

おなじ .venv/bin ディレクトリに pip と python コマンドがあることに注意してください。activate 実行前の Python と pip の実行コマンドの位置を確認しています。

$ which python
/home/{HomeDirectory}/.pyenv/shims/python
$ python -m pip show pip
Name: pip
Version: 22.3.1
Summary: The PyPA recommended tool for installing Python packages.
Home-page: https://pip.pypa.io/
Author: The pip developers
Author-email: distutils-sig@python.org
License: MIT
Location: /home/{HomeDirectory}/.pyenv/versions/3.11.2/lib/python3.11/site-packages
Requires: 
Required-by: 
$ python -m pip list
Package    Version
---------- -------
pip        22.3.1
setuptools 65.5.0

[notice] A new release of pip available: 22.3.1 -> 23.0.1
[notice] To update, run: pip install --upgrade pip

Pyhon コマンドは、/home/{HomeDirectory}.pyenv/shims/python にインストールされているものが使われるようになっています。(この例では、Python のインストールに Pyenv を利用してインストールしています。通常は、/bin/python3 もしくは /usr/bin/python3 が利用されます。Pyenv の利用については、別記事を参照ください。)
同様に、pip についても、/home/{HomeDirectory}/.pyenv/versions/3.11.2/lib/python3.11/site-packages にインストールされたモジュールを利用するようになっています。

対して activate を実行したあとは、以下のようになります。

(.venv) $ which python
/home/{HomeDirectory}/{ProjectDirectory}/.venv/bin/python
(.venv) $ python -m pip show pip
Name: pip
Version: 22.3.1
Summary: The PyPA recommended tool for installing Python packages.
Home-page: https://pip.pypa.io/
Author: The pip developers
Author-email: distutils-sig@python.org
License: MIT
Location: /home/{HomeDirectory}/{ProjectDirectory}/.venv/lib/python3.11/site-packages
Requires: 
Required-by: 
(.venv) $ python -m pip list
Package    Version
---------- -------
pip        22.3.1
setuptools 65.5.0

[notice] A new release of pip available: 22.3.1 -> 23.0.1
[notice] To update, run: pip install --upgrade pip

それぞれ、Python コマンドは、/home/{HomeDirectory}/{ProjectDirectory}/.venv/bin/python
pip モジュールは、/home/{HomeDirectory}/{ProjectDirectory}/.venv/lib/python3.11/site-packages を参照するようになっています。

それでは、実際に activate してみましょう。実行には、source コマンドをもちいて、実行します。

$ source .venv/bin/activate

なぜ、source コマンドを使用するかというと、現在のシェル環境でスクリプトを適用し、環境変数を書き換える必要があるからです。シェバン(#!)をもちいたり、シェルコマンド(例:bash activate)をもちいての実行の場合、別のシェル環境でスクリプトの実行がされ、現在のシェル環境の変数を書き換える動作にはならないからです。そのため、activate スクリプトには、実行権限がついていません。

(.venv) $ 

実行後、コマンドプロンプトの先頭に " (.venv) " と分離環境名が表示されるようになります。
分離環境であることを確認するため、venv 環境でなにか、モジュールを追加してみます。

(.venv) $ 
(.venv) $ python -m pip list
Package    Version
---------- -------
pip        22.3.1
setuptools 65.5.0

[notice] A new release of pip available: 22.3.1 -> 23.0.1
[notice] To update, run: pip install --upgrade pip
(.venv) $ python -m pip install bpytop
Collecting bpytop
  Using cached bpytop-1.0.68-py3-none-any.whl (83 kB)
Collecting psutil<6.0.0,>=5.7.0
  Downloading psutil-5.9.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (280 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 280.2/280.2 kB 6.0 MB/s eta 0:00:00
Installing collected packages: psutil, bpytop
Successfully installed bpytop-1.0.68 psutil-5.9.4

[notice] A new release of pip available: 22.3.1 -> 23.0.1
[notice] To update, run: pip install --upgrade pip
(.venv) $ python -m pip list
Package    Version
---------- -------
bpytop     1.0.68
pip        22.3.1
psutil     5.9.4
setuptools 65.5.0

[notice] A new release of pip available: 22.3.1 -> 23.0.1
[notice] To update, run: pip install --upgrade pip
(.venv) $ which bpytop
/home/inagy/test/.venv/bin/bpytop
(.venv) $ bpytop

試しに bpytop モジュールをインストールしてみます。
python -m pip list コマンドでインストールされたことが確認できます。
which bpytop コマンドでは、.venv/bin にあることがわかります。
実行してみましょう。( "q" で終了)

bpytop の実行画面

venvの終了

つぎに venv を終了します。

(.venv) $ deactivate 
$ 

deactive と入力し実行します。コマンドプロンプトから " (.venv) " がなくなったら、venv 環境が終了したことになります。先程、pip インストールした bpytop モジュールはどうなったでしょうか?

$ python -m pip list
Package    Version
---------- -------
pip        22.3.1
setuptools 65.5.0

[notice] A new release of pip available: 22.3.1 -> 23.0.1
[notice] To update, run: pip install --upgrade pip
$ bpytop
pyenv: bpytop: command not found
$ source .venv/bin/activate
(.venv) $ python -m pip list
Package    Version
---------- -------
bpytop     1.0.68
pip        22.3.1
psutil     5.9.4
setuptools 65.5.0

[notice] A new release of pip available: 22.3.1 -> 23.0.1
[notice] To update, run: pip install --upgrade pip
(.venv) $ deactivate

このとおり、pip list には、表示されなくなります。また bpytop コマンドで実行をためしても、pyenv: bpytop: command not found と表示され実行はできません。
再度、activate をすると pip list に表示されることから、環境が分離されていることが確認できました。

venv 環境の削除

venv関連のファイルは、すべて.venvディレクトリに収まっているので、このディレクトリを削除するだけでよい。

$ rm -rf .venv # .venvディレクトリを削除する
$ cd ..
$ rm -rf {ProjectDirectory} # {ProjectDirectory}を削除してもよい。その場合、.venv環境以外の作成したファイルも削除されてしまうので注意

venv まとめ

確認コマンドをのぞいた、venv 利用に最低限必要なコマンドを示します。

venv 環境の作成手順

$ mkdir {ProjectDirectory}
$ cd {ProjectDirectory}
$ python -m venv .venv

venv の開始

$ source .venv/bin/activate
(.venv) $

venv の終了

(.venv) $ deactivate
$

venv 環境の削除

$ rm -rf .venv

いいなと思ったら応援しよう!