mac + miniconda + VSCodeでPython環境構築
前から書きたかった自分なりのPython環境の構築方法をまとめる。
どの言語でも同様だが、環境構築の際は言語のバージョン管理、プロジェクトごとの環境切り替えが大切になる。nodeであればnodenv+npmで、perlであればplenv+cartonでそれらを実現できる。pythonはというとAnaconda、pyenv、virtualenv、venv、Pipenvなどなど戦国時代のごとく様々なツールが存在し、どれが自分にあっているのか悩む。
各ツールの違いについては以下の記事がわかりやすい。
結局のところ、自分にはminicondaでバージョン管理と環境切り替えをして、コーディングはVSCodeでやるのが一番あっていた。バージョン管理と環境切り替えを1つのツールでできるのが便利。大元のAnacondaと違って、軽いからすぐインストールできる点も嬉しい。
目次
- miniconda
- minicondaのインストール
- condaの簡単な使い方
- 仮想環境を配布する
- condaの注意点
- VSCode
実施環境
miniconda
minicondaのインストール
公式のインストーラでもインストールできるが、macならbrewで一発。
$ brew install Caskroom/cask/miniconda # fishの人は $ conda init fish # ~/.config/fish/config.fishにコマンドが追加される # zshの人は $ conda init zsh # ~/.zshrcにコマンドが追加される
成功すると右側に(base)と表示される。 condaは仮想環境ごとにPythonのバージョンとモジュールを管理していて、baseはデフォルトの仮想環境。
condaの簡単な使い方
# baseのPythonのバージョン $ python --version 3.7.4 # 最初の仮想環境はbaseしかない $ conda info -e # conda environments: # base * /usr/local/Caskroom/miniconda/base # Python 3.8で新しい仮想環境を作成 $ conda create -n test_env python=3.8 # test_envという仮想環境が追加されている $ conda info -e # conda environments: # base * /usr/local/Caskroom/miniconda/base test_env * /usr/local/Caskroom/miniconda/base/envs/test_env # test_envにスイッチ(右側にtest_envと表示される) $ conda activate test_env # しっかりpythonのバージョンが切り替わっている $ python --version 3.8.2 # ここにインストールするモジュールはこの環境下でだけ使える $ conda install numpy -y # モジュールが存在するためバージョン情報を表示できる $ python -c "import numpy;print(numpy.version)" 1.18.1 # デフォルト環境に切り替える $ conda activate base # この環境にはnumpyがないためエラー $ python -c "import numpy;print(numpy.__version__)" Traceback (most recent call last): File "<string>", line 1, in <module> ModuleNotFoundError: No module named 'numpy' # 環境の削除 $ conda remove -n test_env --all # ふりだしに戻る $ conda info -e # conda environments: # base * /usr/local/Caskroom/miniconda/base
プロジェクトごとに新しい仮想環境を作成して、そこに必要モジュールをインストールしていくという使い方になる。 そのプロジェクトで必要なモジュールがなにかはっきりする。
仮想環境を配布する
手元の仮想環境を他の端末や他の人の環境でも再現させることができる。
$ conda create -n test_env python=3.8 $ conda activate test_env $ conda install numpy -y # 環境をenv.yamlに書き出す $ conda env export > test_env.yaml $ cat test_env.yaml name: test_env channels: - defaults dependencies: - blas=1.0=mkl - ca-certificates=2020.1.1=0 ...略 prefix: /usr/local/Caskroom/miniconda/base/envs/test_env # もとの環境を削除しても $ conda activate base $ conda remove -n test_env --all # test_env.yamlで再現できる $ conda env create --file test_env.yaml $ conda info -e
condaの注意点
condaにないモジュール
中にはconda installでは入手できないモジュールも存在するが、そういうときは仕方ないのでpipでインストールする。
condaはpipとは連携していないため、pipでいれたモジュールは仮想環境を切り替えてもimportできてしまうし、conda env export
してもそこに情報は残らない。でも仕方ない。
anyenvやpyenvとの併用
condaが併用するようには作られていないため、バグる可能性がある。
VSCode
(前準備)VSCodeのインストール
以下からインストール
Download Visual Studio Code - Mac, Linux, Windows
必要な拡張機能とモジュールのインストール
エディタとして欲しい機能は①デバッグ機能、②Lint、③自動整形の3つ。
この拡張機能はflake8とautopep8を後ろで動かしてLintと自走整形をするからインストールする。
$ conda activate test_env $ conda install flake8 -y $ conda install autopep8 -y
仮想環境の切り替え
VSCodeの左下にpythonのバージョン情報が書かれるようになった。 そこをクリックするとVSCodeで使うpythonを切り替えられる。
先ほど作成したtest_envにしてみる
Pythonでデバッグ
Pythonファイルを開いてF5を押すとデバッグの構成を聞かれるので「Python File」を選ぶ。
実行結果が下のターミナルに表示される
PythonでLint
setting.jsonでLintにflake8を使うよう書く。
# setting.json "python.linting.enabled": true, "python.linting.pylintEnabled": false, "python.linting.flake8Enabled": true, "python.linting.lintOnSave": true,
参考:https://qiita.com/psychoroid/items/2c2acc06c900d2c0c8cb
保存する度に、文法的な誤りやPEP8に準拠しない書き方の部分に赤波線がつく。 python.linting.lintOnSaveをfalseにすれば、逐次誤りを指摘してくれるが、まだ書き途中に波線つくのが嫌いなのでtrueにしている。
Pythonで自動整形
setting.jsonで自動整形にautopep8を使うよう書く。
# setting.json "python.formatting.provider": "autopep8", "[python]": { "editor.formatOnSave": true, },
保存するたびに、自動整形してくれるようになる。自動整形せずに保存したい場合はコードパレットでSave without Formattingを選ぶ。
一部のルールを無効にする
基本はコーディング規格のPEP8に準拠したいけれど、個人的に3つのルールを--ignoreしている。
E501
横幅を79文字以内にしろというルール。さすがに許して。
W503とW504
複数行にまたがる式を書くときに演算子を前に書け(W503)と後ろにかけ(W504)という矛盾した対のルール
# W503準拠 income = (gross_wages + taxable_interest) # W504準拠 income = (gross_wages + taxable_interest)
好みの方だけ--ignoreできるよう2つ用意されているが、喧嘩両成敗でどちらも--ignoreしてしまう。他の人のコードをVSCodeで見るときに赤波線がついてほしくない
setting.json
# setting.json "python.linting.flake8Args": [ "--ignore=E501,W503,W504", ], "python.formatting.autopep8Args": [ "--ignore=E501" ],
autppep8の方は、何もしなくてもデフォルトでW503とW504の整形が無効化されている。整形してほしい場合は--selectを使う。
# setting.json "python.formatting.autopep8Args": [ "--ignore=E501", "--select=W503" ],
まとめ
- バージョンと環境切り替えはconda
- コーディングはVSCode
よきpythonライフを〜