venv¶
pip
を使ってサードパーティ製のパッケージをインストールすることができましたが、インストールしたいパッケージが稀に競合を起こすことがあります。
プログラム | requests の要求バージョン |
---|---|
program1 | 2.21.0 |
program2 | 2.20.1 |
program1 では requests
2.21.0 を使おうとしているのに対し program2 では 2.20.1 を使いたかったとすると、システムの中に複数バージョンの requests
をインストールしておく必要が出てきます。もし使用したいパッケージのバージョンが意図しないものになっているとプログラムが正しく動かない可能性が出てきます。
仮想環境の作成¶
このような競合を解決するために Python には各プログラムで使用したいパッケージを互いに影響がない形で個別に管理するための仕組みが用意されており、仮想環境と呼ばれます。仮想環境を作成するためのツールは venv
と呼ばれ、Python に標準で同梱されています。
試しにこれから 2 つの仮想環境を作成し、それぞれに異なるバージョンの requests
をインストールしてみます。まず下記のように 2 つのディレクトリを作成します。
$ mkdir program1 program2
次に program1 配下で仮想環境を作成します。
$ cd program1
$ python3 -m venv .venv
$ cd program1
$ py -3 -m venv .venv
program1 配下に .venv
というディレクトリが作成されます。仮想環境を有効にするために下記のコマンドを実行します。
$ . .venv/bin/activate
(.venv) $
$ .venv\Scripts\activate.bat
(.venv) $
この状態で requests
2.21.0 をインストールしてみます。パッケージをバージョン指定でインストールしたければ次のように実行します。
(.venv) $ pip install requests==2.21.0
Note
仮想環境が有効な場合であれば pip コマンドは pip
が使用できます。
pip3
コマンドも使用できますが、どちらを使用しても効果は同じです。
一方で仮想環境が無効な状態であれば pip
は Python 2 系の古い pip を呼び出すことになり
pip3
とは挙動が異なるので注意してください。
この requests
は .venv ディレクトリ配下にインストールされ、仮想環境が有効でない限りは参照することができないようになっています。 pip freeze
を使ってインストールされているパッケージ一覧を確認してみます。
(.venv) $ pip freeze
certifi==2019.3.9
chardet==3.0.4
idna==2.8
requests==2.21.0
urllib3==1.24.1
仮想環境を無効にする場合は deactivate
というコマンドを実行します。このコマンドは仮想環境が有効なときだけ使用することができます。
(.venv) $ deactivate
$
(.venv) $ venv\Scripts\deactivate.bat
$
program2 配下でも同様に仮想環境を作成してみます。requests
のバージョンは 2.20.1 を使用します。
$ cd program2
$ python3 -m venv .venv
$ . .venv/bin/activate
(.venv) $ pip install requests==2.20.1
(.venv) $ pip freeze
certifi==2019.3.9
chardet==3.0.4
idna==2.7
requests==2.20.1
urllib3==1.24.1
$ cd program2
$ py -3 -m venv .venv
$ .venv\bin\activate.bat
(.venv) $ pip install requests==2.20.1
(.venv) $ pip freeze
certifi==2019.3.9
chardet==3.0.4
idna==2.7
requests==2.20.1
urllib3==1.24.1
program1, program2 配下いずれかの仮想環境を有効にすることで異なるバージョンの requests
が使用できるようになっています。ちなみに仮想環境が有効でない状態でインストールされたパッケージは全プログラムから参照可能なので競合を起こす可能性があり、使用すべきではありません。そのため、前章の pip
の章でインストールしたパッケージは下記のように削除しておくことをおすすめします。
$ pip3 freeze > requirements.txt
$ pip3 uninstall -y -r requirements.txt