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