はじめに
複数のPython3系プロジェクトで、同じライブラリの別バージョンを使うケース(片方はプロダクションでバージョン固定、片方では最新バージョンで試したかった)が出たため、venvを使って実行環境を分けた際の覚書です。
下記の環境の通りPython3.3以降導入済み、かつVSCodeで開発していてローカルデバッグとかローカルテストしている人で、(止むを得ず)実行環境分けたい人向けです。
環境
- Mac (事情があり未だHigh Sierra;;)
- Python3.3以降 (今回は3.7で行なっています)
- Visual Studio Code バージョン1.32.3
- Python拡張(
ms-python.python
)インストール済み
- Python拡張(
なお、Python3の環境構築は省略します。(brewでもpyenvでも好きなので入れれば良いと思います)
仮想環境の構築とVSCodeの設定手順
Python3.3以降では、仮想環境構築のためのモジュールが標準で搭載されている。
→venv
これを利用しつつ、なるべく最小手順で、混乱のない環境になるよう考えた結果以下となりました。
仮想環境管理用ディレクトリ作成
Pythonの仮想環境は、ディレクトリの形式で作成される。
このディレクトリを作成する先として、仮想環境管理用のディレクトリを作成する。
別にやらなくても良いかと思うかもしれないが、以下の理由で強く推奨したい。
- あちこちに仮想環境ディレクトリがあると管理できなくなる
- VSCodeに仮想環境管理用ディレクトリの設定をする(後述)ことで、デバッグ、テスト環境設定のハードルが下がる
mkdir ~/.local/share/virtualenvs
仮想環境の作成
python -m venv ~/.local/share/virtualenvs/venv1
仮想環境の作成は上記コマンドで終わり、 ~/.local/share/virtualenvs/venv1
に分離されたPython環境ができる。
コマンドライン上で、この仮想環境を使いたければ
source ~/.local/share/virtualenvs/venv1/bin/activate
とすれば、仮想環境上のPythonが実行されるようになる。
( which python
などを実行すれば、 python
のパスが変わっているのが確認できる)
この状態で、
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の実行環境が表示されていると思います。
仮想環境管理用ディレクトリをVSCodeに設定した後に、これをクリックすると先ほど作成した仮想環境が一覧に現われます。
ここから先ほど作成した仮想環境(今回の場合は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のラッパーという理解。
おまけその2 Python local packages directory
ついでなので追記で書きます。
少し前に話題になったGoodbye Virtual Environments?で取り上げられていた、PEP582はローカルパッケージディレクトリに依存パッケージを入れておき、Pythonコマンドは一番最初にローカルパッケージディレクトリを参照しに行くというものです。(vendoringやnode_modulesに近いもの概念だと理解してます。)
仮にこれが採用されると、
ローカルパッケージディレクトリを作成
mkdir __pypackages__
ローカルパッケージディレクトリにパッケージインストール
python -m pip install requests
のような運用になると想定されます。(採用されればpip側でサブコマンド作るかもしれませんが)
ですが、まだまだ Draft
の段階なのでしばらくは注視かなと思っています。