dorapon2000’s diary

忘備録的な。セキュリティとかネットワークすきです。

mac + miniconda + VSCodeでPython環境構築

前から書きたかった自分なりのPython環境の構築方法をまとめる。

どの言語でも同様だが、環境構築の際は言語のバージョン管理、プロジェクトごとの環境切り替えが大切になる。nodeであればnodenv+npmで、perlであればplenv+cartonでそれらを実現できる。pythonはというとAnacondapyenvvirtualenvvenvPipenvなどなど戦国時代のごとく様々なツールが存在し、どれが自分にあっているのか悩む。

各ツールの違いについては以下の記事がわかりやすい。

qiita.com

結局のところ、自分にはminicondaでバージョン管理と環境切り替えをして、コーディングはVSCodeでやるのが一番あっていた。バージョン管理と環境切り替えを1つのツールでできるのが便利。大元のAnacondaと違って、軽いからすぐインストールできる点も嬉しい。

目次

  • miniconda
    • minicondaのインストール
    • condaの簡単な使い方
    • 仮想環境を配布する
    • condaの注意点
  • VSCode

実施環境

  • macOS Catalina 10.15.4
  • fish 3.1.0
  • conda 4.7.12
  • VSCode 1.44.4

miniconda

minicondaのインストール

公式のインストーラでもインストールできるが、macならbrewで一発。

$ brew install Caskroom/cask/miniconda

# fishの人は
$ conda init fish  # ~/.config/fish/config.fishにコマンドが追加される

# zshの人は
$ conda init zsh  # ~/.zshrcにコマンドが追加される

f:id:dorapon2000:20200429004122p:plain

成功すると右側に(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つ。

marketplace.visualstudio.com

拡張機能Pythonを入れる。

この拡張機能はflake8とautopep8を後ろで動かしてLintと自走整形をするからインストールする。

$ conda activate test_env
$ conda install flake8 -y
$ conda install autopep8 -y

仮想環境の切り替え

f:id:dorapon2000:20200429131811p:plain

VSCodeの左下にpythonのバージョン情報が書かれるようになった。 そこをクリックするとVSCodeで使うpythonを切り替えられる。

f:id:dorapon2000:20200429131847p:plain

先ほど作成したtest_envにしてみる

f:id:dorapon2000:20200429131905p:plain

Pythonデバッグ

Pythonファイルを開いてF5を押すとデバッグの構成を聞かれるので「Python File」を選ぶ。

f:id:dorapon2000:20200429133052p:plain

実行結果が下のターミナルに表示される

f:id:dorapon2000:20200429133109p:plain

Hello world!!

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

f:id:dorapon2000:20200429134223p:plain

保存する度に、文法的な誤りや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文字以内にしろというルール。さすがに許して。

W503W504

複数行にまたがる式を書くときに演算子を前に書け(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ライフを〜