目的
表題のような開発環境を構築することと、その環境を移行しやすくする。
環境
- macOS Sierra
- なんらかの方法でPython3.6インストール済み(
brew install python3が一番簡単?) - VSCodeの
codeコマンドをインストール済み
要件
- Python3でしか開発しない
- VSCodeを使いたい
- VSCodeでIntelliSense、Linting、Formattingしてほしい
-
pipでインストールしたパッケージ一覧を保存して、他の環境で再構築したい - グローバルな
pipでグローバルな環境を汚したくない
ツール
という要件を満たすようなツールを作った。
https://gist.github.com/KoheiKanagu/b3ba2bb68d36509b6cee054e077bd415
$ python3 pset.py -h
usage: pset.py [-h] [--init] [-i] [-s] [-j] [-c]
This script deitals : http://qiita.com/KoheiKanagu/items/752c64aeeb154970d22e
optional arguments:
-h, --help show this help message and exit
--init Initialize Python virtual environment
-i, --install Install packages from "requirements.txt"
-s, --sync Sync packages using of pip-compile and pip-sync
-c, --code Open VSCode at virtual environment
それぞれのargumentsの動き
--initすると
-
python3 -m venvを使って、 .env という名前の仮想環境を作る。 - pip-toolsをインストールする
- requirements.inが無ければ作り、pip-toolsと書き込んでおく。
--installすると
- installすると同ディレクトリに requirements.txt があれば
pip install -r requirements.txtでパッケージ達をインストールする。
--syncすると
- requirements.in をpip-compileして、pip-syncする
--codeすると
-
source .env/bin/activate && code ./して仮想環境を引き継いだVSCodeを起動する。
備考
Formatting
グローバルな環境に autopep8 かなんかをインストールしておけば良い。
後述するLintingのように、formatterは仮想環境の中にあるパッケージなどは見る必要がないので、グローバルにインストールしててもちゃんとFormattingしてくれる。
Linting
例えば pylint を使うとなると、グローバルにインストールしておいても、仮想環境でインストールしたパッケージ達を見てくれないので、IntelliSenseできない。
そこで、仮想環境に pylint をインストールすれば、仮想環境内でのパッケージ達を見てくれるので、IntelliSenseできる。
jupyterも同様に仮想環境にインストールしたものでないとパッケージ達を見つけられない
VSCodeの状態
ツールを使うと、
source .env/bin/activate && code ./という風にVSCodeを起動する。
そのため、VSCodeの端末で pip freeze などをしてもらうと分かるが、VSCodeは仮想環境を引き継いでいる。
そのため、プログラムを実行する場合にその端末から実行すると、仮想環境で実行される。
また、Code Runner を使っても同じく仮想環境で実行することができる。
エクスプローラーの表示
VSCodeの画面左のエクスプローラーに .env が出てくるため、その中身が検索に引っかかるし、中にあるhtmlとかcssなどのいろいろなファイルに対してLinterがブチギレるので、以下のように files.excludeに追記する。
すると無視されてエクスプローラーには表示されないし、Linterも怒らなくなる。
もちろん仮想環境的には問題ない
"files.exclude": {
"**/.git": true,
"**/.svn": true,
"**/.hg": true,
"**/CVS": true,
"**/.DS_Store": true,
"**/.env/**": true
}
パッケージのインストール
source .env/bin/activate してからpip installする。
ただし、pip-compileとpip-syncの利用を想定しているので、requirements.in に必要なパッケージを書いて、python3 pset.py --sync した方が楽
requirements.in に何も書いてない状態で--syncしてしまうと、pip-syncの機能によってインストール済みのパッケージが全部消えるので注意
tips
Python2.7への対応
pyenv などと連携すればできるとは思うが、個人的に2.7は必要ないので試してはいない。
ディレクトリ名の変更時の注意
こんな ~/MyProject/.env/* ディレクトリ名内で仮想環境を作った時、 ~/MyProject2/.env/* という風に名前を変えてしまうと、 source ~/MyProject2/.env/bin/activate しても仮想環境に移行できなくなる。
その時は .env を一旦削除して再設定するといい