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']
   >>>

Note that the activated virtual environment does not alter the
"PYTHONPATH" variable in any way. This may lead to unexpected results
if the path includes references to code which is incompatible with the
Python version the virtual environment is using. The best practice is
to "unset PYTHONPATH" in bash or the equivalent for the shell you are
using.

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

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