【Python3×VSCode】実行環境を分ける必要が出たら行う手順（仮想環境作成）

# はじめに

複数のPython3系プロジェクトで、同じライブラリの別バージョンを使うケース（片方はプロダクションでバージョン固定、片方では最新バージョンで試したかった）が出たため、[venv](https://docs.python.org/ja/3/library/venv.html)を使って実行環境を分けた際の覚書です。

下記の環境の通りPython3.3以降導入済み、かつVSCodeで開発していてローカルデバッグとかローカルテストしている人で、（止むを得ず）実行環境分けたい人向けです。


## 環境

- Mac （事情があり未だHigh Sierra；；）
- Python3.3以降 （今回は3.7で行なっています）
- Visual Studio Code バージョン1.32.3
    - Python拡張（`ms-python.python`）インストール済み

なお、Python3の環境構築は省略します。（brewでもpyenvでも好きなので入れれば良いと思います）

# 仮想環境の構築とVSCodeの設定手順

Python3.3以降では、仮想環境構築のためのモジュールが標準で搭載されている。
→[venv](https://docs.python.org/ja/3/library/venv.html)

これを利用しつつ、なるべく最小手順で、混乱のない環境になるよう考えた結果以下となりました。

## 仮想環境管理用ディレクトリ作成

Pythonの仮想環境は、ディレクトリの形式で作成される。
このディレクトリを作成する先として、仮想環境管理用のディレクトリを作成する。

別にやらなくても良いかと思うかもしれないが、以下の理由で強く推奨したい。

- あちこちに仮想環境ディレクトリがあると管理できなくなる
- VSCodeに仮想環境管理用ディレクトリの設定をする（後述）ことで、デバッグ、テスト環境設定のハードルが下がる

```sh
mkdir ~/.local/share/virtualenvs
```

## 仮想環境の作成

```sh
python -m venv ~/.local/share/virtualenvs/venv1
```

仮想環境の作成は上記コマンドで終わり、 `~/.local/share/virtualenvs/venv1` に分離されたPython環境ができる。
コマンドライン上で、この仮想環境を使いたければ

```sh
source ~/.local/share/virtualenvs/venv1/bin/activate
```

とすれば、仮想環境上のPythonが実行されるようになる。
( `which python` などを実行すれば、 `python` のパスが変わっているのが確認できる)

この状態で、

```sh
pip install requests
```

などとすれば、 仮想環境上 `~/.local/share/virtualenvs/venv1/lib/python3.7/site-packages` にライブラリがインストールされる。

## VSCodeでの仮想環境管理用ディレクトリを基本設定に追加

Command + Shift + p
→ 「`setting`」などと入力
→ 「基本設定: ユーザー設定を開く / Preferences: Open User Setting」をクリック

または

メニューから「Code」
→「基本設定」 
→「設定」

の操作で、「設定」画面を開く。

「設定の検索」ボックスに「`python.venvpath`」と入力する。
→`Python: Venv Path` という設定項目が出るので、設定値のボックスに先ほど作成した仮想環境管理用ディレクトリのパス「`~/.local/share/virtualenvs`」を入力する。


## VSCodeでのPython実行環境選択

Python拡張をインストールしている状態で、Pythonのプロジェクトを開くと
左下にPythonの実行環境が表示されていると思います。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/26693/e90ca885-ec12-bd5c-63bf-f2a5623d67aa.png)
 　　　↑これです


仮想環境管理用ディレクトリをVSCodeに設定した後に、これをクリックすると先ほど作成した仮想環境が一覧に現われます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/26693/5aa97b28-db21-8e24-3e3f-37cf2e801990.png)


ここから先ほど作成した仮想環境（今回の場合は`venv1`）を選択します。
すると、 `.vscode/setting.json` が自動生成され、`python.pythonPath`に仮想環境のPythonが設定されます。

ここまで終われば、普段の通りの使い方でデバッグ環境やテスト環境、補完などが仮想環境上で実行されるようになっているはずです。


# おまけ: pipenvについて

大抵の場合は、上記のvenvのみの運用でも十分だと思いますが、

- Pythonの依存パッケージをハッシュレベルの厳密性を持って管理したい
- 複数の開発者で、簡単に同じ仮想環境を使えるようにしたい
- 一連の作業（仮想環境作成、依存パッケージインストールなど）を統一したコマンドで扱いたい

という要望があれば、 `pipenv` を使うと良いと思います。

嬉しいことに、VSCodeのPython拡張が対応しており、`pipenv`を実行したワークスペースでは `.vscode/setting.json` に`python.pythonPath` が自動で追加されます。

サクッと小さめに紹介しておきます。

### インストール方法

```
pip install pipenv
```

### 仮想環境作成

仮想環境を作成したいディレクトリ配下で

```
pipenv --three
```

python3の仮想環境が作成されます。 (デフォルトで `~/.local/share/virtualenvs` 配下にできています。)
また、 `Pipfile` という管理ファイルがディレクトリ配下にできています。


### パッケージインストール

```
pipenv install requests
```

`Pipfile`に追加されたパッケージ名が追記されます。
また、`Pipfile.lock`が作成され、追加パッケージ含む全ての依存パッケージのハッシュが記載されます。

`Pipfile`, `Pipfile.lock` を別の環境に持っていき`pipenv install`すると、
全く同じ環境ができるということになります。

### コマンドラインで仮想環境実行

```
pipenv shell
```

activateのラッパーという理解。

# おまけその２ Python local packages directory

ついでなので追記で書きます。

少し前に話題になった[Goodbye Virtual Environments?](https://medium.com/@grassfedcode/goodbye-virtual-environments-b9f8115bc2b6)で取り上げられていた、[PEP582](https://www.python.org/dev/peps/pep-0582/)はローカルパッケージディレクトリに依存パッケージを入れておき、Pythonコマンドは一番最初にローカルパッケージディレクトリを参照しに行くというものです。（vendoringやnode_modulesに近いもの概念だと理解してます。）

仮にこれが採用されると、

#### ローカルパッケージディレクトリを作成

```sh
mkdir __pypackages__
```


#### ローカルパッケージディレクトリにパッケージインストール

```sh
python -m pip install requests
```

のような運用になると想定されます。（採用されればpip側でサブコマンド作るかもしれませんが）
ですが、まだまだ `Draft` の段階なのでしばらくは注視かなと思っています。