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 を参照してください。
