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


12.1. はじめに
==============

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

そのため、1つのインストールされたPythonが全てのアプリケーションの要求
に対応することは不可能です。もしアプリケーションAがあるモジュールのバ
ージョン 1.0 を要求していて、別のアプリケーションBが同じモジュールのバ
ージョン 2.0 を要求している場合、2つの要求は衝突していて、1.0 と 2.0
のどちらかのバージョンをインストールしても片方のアプリケーションが動き
ません。

この問題の解決策は *仮想環境* を作ることです。仮想環境とは、特定のバー
ジョンの Python と幾つかの追加パッケージを含んだ 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 や Mac OS の場合:

   source tutorial-env/bin/activate

(このスクリプトは bash shell で書かれています。 **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']
   >>>

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

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