venv で仮想環境を作る。

WARNING

本記事は macOS を対象にしています。 Windows は対象にしていません。

仮想環境ってなに?

「仮想環境」と大げさに言いましたが、 簡単に言えば pip install する環境を分けるだけです。

例えば Django のためにインストールしたものもあれば Flask のためにインストールしたものもあるはずです。 それを一箇所で管理するのは、いろいろと怖いものがあります。

virtualenv - PyPI (venv は昔は virtualenv と呼ばれてました。)

いま、あなたは version 1 の LibFoo を必要とするアプリケーションを持っていて、一方で別のアプリケーションでは version 2 が必要な状況を考えて見てください。
Imagine you have an application that needs version 1 of LibFoo, but another application requires version 2.

どうやって2つのアプリケーションを使いますか?
How can you use both these applications?

もし全てを /usr/lib/python2.7/site-packages (あるいは、あなたのプラットフォームの標準場所がなんであろうとも) にインストールした場合、
If you install everything into /usr/lib/python2.7/site-packages (or whatever your platform’s standard location is),

アップグレードしてはいけないアプリケーションを意図せずアップグレードしてしまうような状況に簡単に陥ってしまうでしょう。
it’s easy to end up in a situation where you unintentionally upgrade an application that shouldn’t be upgraded.

もうちょっと詳しくいうと、 site-packages を分けるだけです。 「site-packages を分けるってなんだ?」って話です。

pip install したときに site-packages という名前のディレクトリに保存されます。 venv は、このディレクトリをわけてくれるツールです。

この記事では venv を使って仮想環境を構築できるようにします。 site-packages の居場所は、sys.path から簡単に調べることができます。

import sys
print(*sys.path, sep="\n")
>>> import sys
>>> print(*sys.path, sep="\n")

/usr/local/Cellar/python/3.7.2_2/Frameworks/Python.framework/Versions/3.7/lib/python37.zip
/usr/local/Cellar/python/3.7.2_2/Frameworks/Python.framework/Versions/3.7/lib/python3.7
/usr/local/Cellar/python/3.7.2_2/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload
/usr/local/lib/python3.7/site-packages  <--- ここ
>>> 

ここで調べられた site-packages 配下にあるファイルと pip freeze した 結果を見比べてみてください。 だいたいは一致するはずです。

ls -la /usr/local/lib/python3.7/site-packages
pip3 freeze
$ ls -la /usr/local/lib/python3.7/site-packages
total 320
drwxr-xr-x  28 UFO  admin     952  2 14 21:28 .
drwxr-xr-x   3 UFO  admin     102  9 30  2018 ..
drwxr-xr-x  19 UFO  admin     646  2 14 21:28 pbr
-rw-r--r--   1 UFO  admin   32452  2 14 21:28 six.py
drwxr-xr-x  15 UFO  admin     510  2 14 21:28 stevedore
...
$
$ pip3 freeze
pbr==5.1.2
six==1.12.0
stevedore==1.30.0
...
$ 

◯ venv の歴史

venv はもともと virtualenv と呼ばれていたツールが、正式に採用されたものです。 PEP 405 に経緯等が書かれています。いまでも pip install virtualenv とするとインストールすることができます。 機能的には、ほぼ同じです。また古い記事で virtualenv と書かれているものも venv に読み替えて適用することができます。

◯ そのほかのツール

pyenv, pipenv Poerty など色々ツールがあるのですが、正直、どう言うものかあまりわかっていません。

Python 本体のバージョンを切り替えるツールもあるそうですが、ここではインストールしません。 pyenv, poetry, pipenv とツールはあるのですが、 そこまでのものは必要ないのではないかという意見を見たためです。 これをすれば良くなるよりも、これは要らないという情報の方が本当に助かります。 ありがとうございます。

仮想環境の構築

venv は、pip でインストールしたモジュールをアプリケーションごとに切り替えて使いたいときに使います。

Step1. 仮想環境を保存するディレクトリを作成

$ mkdir ~/.virtualenvs

~/.virtualenvs と言うファイルパスは、 このあとご紹介する virtualenvwrapper というツールの マニュアル に準拠しました。

Step2. 仮想環境を作成

$ # python3 -m venv ~/.virtualenvs/仮想環境名
$ python3 -m venv ~/.virtualenvs/my_venv_name

Step3. 仮想環境を有効にします。

$ # 仮想環境を有効にします。
$ source .virtualenvs/my_env_name/bin/activate
(my_venv_name) $
(my_venv_name) $ #仮想環境を無効にします。
(my_venv_name) $ deactivate
$

sourceコマンドとは?

「source」コマンドは、ファイルに書かれたコマンドを現在のシェルで実行する、 というコマンドです。主にシェルの設定ファイルを反映させる際に使用します。

... 中略 ...

「bash ファイル」(またはファイル名のみを入力してシェルスクリプト)を実行した場合と、 sourceコマンドを用いた場合は、何が違うのでしょうか... 以下略

virtualenvwrapper のインストール

仮想環境を有効にするためにその都度 source するのは面倒なので、 ショートカットコマンド workon というコマンドを作ってくれます。

Step1. インストール

$ pip install virtualenvwrapper

Step2. 設定

~/.bashrc に、以下の3行を追記する。

$ nvim ~/.bashrc
export VIRTUALENVWRAPPER_PYTHON=/usr/local/bin/python3
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh

Step3. 反映

$ # 設定を有効にする。
$ source ~/.bashrc

virtualenvwrapper の使い方

◯ 有効 workon

$ workon my_venv_name
(my_venv_name)$ 

◯ 無効 deactivate

(my_venv_name)$ deactivate
$

◯ 作成 mkvirtualenv

--python オプション は、使用するインタプリタを指定します。 その後ろの py3env は環境名を指定しています。 /Users/ユーザ名/.virtualenvs/py3env というディレクトリが新しく作成されます。

$ mkvirtualenv --python=python3 py3env
(py3env)$ 
(py3env)$ deactivate
$ 
$ mkvirtualenv --python=python  py2env
(py2env)$ deactivate
$ 

◯ 一覧 workon

$ # 環境の一覧の表示
$ workon
my_venv_name
py2env
py3env
$

◯ workon すると同時に cd したい

/Users/ユーザ名/.virtualenvs/py3env/bin/postactivate というファイルを作り workon 時に実行したいスクリプトを書くことができます。 これを利用して workon と同時に移動したいディレクトリを指定できます。

#!/bin/sh

cd 移動したいディレクトリ

postactivate - Per-User Customization
The local $VIRTUAL_ENV/bin/postactivate script is sourced after the new environment is enabled. $VIRTUAL_ENV refers to the new environment at the time the script runs.

Last Updated: 5/24/2019, 2:47:11 AM