12. 仮想環境とパッケージ

12.1. はじめに

Python アプリケーションは、標準ライブラリに含まれないパッケージやモジュールをよく使います。特定のバグの修正が必要だったり、古いバージョンのライブラリのインターフェイスに依存していたりするため、ライブラリの特定のバージョンが必要になることもあります。

このため、1つの Python 環境ですべてのアプリケーションの要求を満たせるとは限りません。アプリケーション A があるモジュールのバージョン 1.0 を必要とし、アプリケーション B がバージョン 2.0 を必要とする場合、両者の要求は衝突します。1.0 と 2.0 のどちらをインストールしても、片方のアプリケーションは動作しません。

この問題は 仮想環境 を作ることで解決できます。仮想環境とは、特定のバージョンの Python といくつかの追加パッケージを含む自己完結したディレクトリ構造です。

アプリケーションごとに異なる仮想環境を使うことができます。先ほどの例では、アプリケーション A 専用の仮想環境にバージョン 1.0 をインストールし、アプリケーション B 用の仮想環境にバージョン 2.0 をインストールすれば要求の衝突を解決できます。アプリケーション B のためにライブラリをバージョン 3.0 に更新する必要があっても、アプリケーション A の環境には影響しません。

12.2. 仮想環境の作成

仮想環境の作成と管理には venv モジュールを使います。venv はそのコマンドを実行したバージョンの Python をインストールします。このバージョンは --version オプションで確認できます。例えば python3.12 でコマンドを実行すると、バージョン 3.12 がインストールされます。

仮想環境を作るには、配置先のディレクトリを決めます。そのパスを指定して venv モジュールをスクリプトとして実行してください:

python -m venv tutorial-env

tutorial-env ディレクトリがなければ作成されます。その中にサブディレクトリも作られ、Python インタープリタのコピーや各種の補助ファイルが配置されます。

仮想環境のディレクトリには .venv という名前がよく使われます。この名前ならディレクトリの用途が分かり、通常はシェルで非表示になるため邪魔になりません。また、一部のツールが使う環境変数定義ファイル .env との名前の衝突も避けられます。

仮想環境を作ったら、有効化することができます。

Windows では次を実行します:

tutorial-env\Scripts\activate

Unix や macOS では次を実行します:

source tutorial-env/bin/activate

(このスクリプトは bash シェル用です。csh や fish を使っている場合は、代わりに activate.csh や activate.fish スクリプトを使ってください。)

仮想環境を有効化すると、使用中の仮想環境がシェルのプロンプトに表示されます。また、python を実行するとその仮想環境の Python が起動するように環境が変更されます。例えば次のようになります:

$ source ~/envs/tutorial-env/bin/activate
(tutorial-env) $ python
Python 3.5.1 (default, May  6 2016, 10:59:36)
  ...
>>> import sys
>>> sys.path
['', '/usr/local/lib/python35.zip', ...,
'~/envs/tutorial-env/lib/python3.5/site-packages']
>>>

仮想環境を有効化しても PYTHONPATH 変数は一切変更されないことに注意してください。仮想環境の Python バージョンと互換性のないコードへのパスが含まれていると、予期しない結果になることがあります。bash では unset PYTHONPATH を実行し、ほかのシェルでも同等の操作で設定を解除することをお勧めします。

仮想環境を無効化するには、ターミナルに:

deactivate

と入力します。

12.3. pip を使ったパッケージ管理

pip というプログラムを使って、パッケージのインストール、アップグレード、削除ができます。デフォルトでは pip は Python Package Index からパッケージをインストールします。Python Package Index はウェブブラウザで閲覧できます。

pip には "install"、"uninstall"、"freeze" などのサブコマンドがあります。(pip の詳しいドキュメントについては Python モジュールのインストール ガイドを参照してください。)

パッケージ名を指定すると、そのパッケージの最新版をインストールできます:

(tutorial-env) $ python -m pip install novas
Collecting novas
  Downloading novas-3.1.1.3.tar.gz (136kB)
Installing collected packages: novas
  Running setup.py install for novas
Successfully installed novas-3.1.1.3

パッケージ名の後に == とバージョン番号を付けると、特定のバージョンをインストールすることもできます:

(tutorial-env) $ python -m pip install requests==2.6.0
Collecting requests==2.6.0
  Using cached requests-2.6.0-py2.py3-none-any.whl
Installing collected packages: requests
Successfully installed requests-2.6.0

このコマンドを再実行しても、pip は指定されたバージョンがインストール済みであることを確認して何もしません。別のバージョン番号を指定すれば、そのバージョンをインストールできます。また、python -m pip install --upgrade を実行すればパッケージを最新版に更新できます:

(tutorial-env) $ python -m pip install --upgrade requests
Collecting requests
Installing collected packages: requests
  Found existing installation: requests 2.6.0
    Uninstalling requests-2.6.0:
      Successfully uninstalled requests-2.6.0
Successfully installed requests-2.7.0

python -m pip uninstall の後に1つ以上のパッケージ名を指定すると、それらのパッケージが仮想環境から削除されます。

python -m pip show は指定したパッケージの情報を表示します:

(tutorial-env) $ python -m pip show requests
---
Metadata-Version: 2.0
Name: requests
Version: 2.7.0
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: me@kennethreitz.com
License: Apache 2.0
Location: /Users/akuchling/envs/tutorial-env/lib/python3.4/site-packages
Requires:

python -m pip list は仮想環境にインストールされているすべてのパッケージを表示します:

(tutorial-env) $ python -m pip list
novas (3.1.1.3)
numpy (1.9.2)
pip (7.0.3)
requests (2.7.0)
setuptools (16.0)

python -m pip freeze もインストール済みのパッケージ一覧を出力しますが、こちらは python -m pip install が受け付ける形式を使います。この一覧は通常、requirements.txt というファイルに保存します:

(tutorial-env) $ python -m pip freeze > requirements.txt
(tutorial-env) $ cat requirements.txt
novas==3.1.1.3
numpy==1.9.2
requests==2.7.0

requirements.txt はバージョン管理システムにコミットし、アプリケーションの一部として配布できます。ユーザーは install -r で必要なパッケージをすべてインストールできます:

(tutorial-env) $ python -m pip install -r requirements.txt
Collecting novas==3.1.1.3 (from -r requirements.txt (line 1))
  ...
Collecting numpy==1.9.2 (from -r requirements.txt (line 2))
  ...
Collecting requests==2.7.0 (from -r requirements.txt (line 3))
  ...
Installing collected packages: novas, numpy, requests
  Running setup.py install for novas
Successfully installed novas-3.1.1.3 numpy-1.9.2 requests-2.7.0

pip にはほかにも多くのオプションがあります。pip の詳しいドキュメントについては Python モジュールのインストール ガイドを参照してください。作成したパッケージを Python Package Index で公開するには、Python packaging user guide を参照してください。