ann-toque’s diary

@YASU11552288 の思うことをつらつらと

【Python】分析と開発のプロジェクト間を切り替え容易な環境を構築(pyenv + poetry + VScodeでJupyter Notebook)

こんにちはann-toqueです。この記事を書こうと思ったのはPythonを利用した業務改善のための開発を行い、かつ分析案件も並行して抱えてた際に、Jupyter Notebookを利用したインタラクティブな分析環境と前述の開発環境の両立を図りたく、タイトルの構成になったので紹介したいと思います。

記事について

対象者:

  • Jupyter Notebookを利用して分析を行うし、python単体のちょっとしたコードも書く方
  • 分析の時はJupyter Notebook、開発の時は別のエディタ、IDEと使い分けててスイッチングコストが高いなと感じている方

内容:

  • プロジェクト毎にpythonのバージョン、モジュール管理を行い、Visual Studio Code上でJupyter Notebookを利用する方法

触れないこと:

  • Windows版の構築方法(まぁ大きな流れはそんなに変わらんとは思います)
  • インストール方法の詳細などは参考記事が多数あるので触れません

概要

今回はエディタをVScodeで統一し、pyenvとpoetryで開発環境と分析環境を分けて、分析環境のみでVScodeのJupyter Notebookを利用できる構成を作りました。構成のそれぞれの説明・役割については以下の通りです。

構築の流れ

  1. poetryのインストール
  2. pyenvのインストール
  3. VScodeのインストール
  4. VScodeでpoetryで追加したモジュールを読み込めるようにする
  5. VScodePythonインタプリンタにpyenvのPythonを追加
  6. poetryでJupyter Notebookを追加

※ 1-3は特に依存関係ないのでどれからインストールしれも構いません

poetryのインストール

以下の記事にpoetryの解説・インストール方法の記載がありますので、ここでは大まかな利用方法だけ記載します。 Poetry: Python の依存関係管理とパッケージングを支援するツール | org-技術

プロジェクトの作成

__init__.py や README.md、testディレクトリなどのディレクトリやファイルが生成されます。pyproject.tomlが構成管理ファイルにあたります。

$ poetry new playground-analytics

モジュールの追加

今後poetryを利用し、モジュールを追加していくとpyproject.tomlの [tool.poetry.dependencies] が更新されていきます。

$ poetry add sklearn@latest
[tool.poetry]
name = "playground-analytics"
version = "0.1.0"
description = ""
authors = ["anntoque <???@email.com>"]

[tool.poetry.dependencies]
python = "^3.7"
sklearn = "^0.0"
pandas = "^1.0.3"
matplotlib = "^3.2.1"
jupyter = "^1.0.0"
seaborn = "^0.10.1"
scipy = "^1.4.1"
statsmodels = "^0.11.1"

[tool.poetry.dev-dependencies]
pytest = "^4.6"

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"

pyproject.toml の読み込み

pyproject.toml さえあればGitHubなどのリモートリポジトリ上で共有されているプロジェクトをローカルに落とした際も環境の再現が可能です。

poetry install

pyenvのインストール

Homebrewを利用する場合は以下の通りです。

$ brew install pyenv

bashを利用したインストール方法も用意されています。
pyenv/pyenv-installer: This tool is used to install pyenv and friends.

利用方法

まず pyenv installで利用したいバージョンのpythonをダウンロードし、pyenv localでそのディレクトリ配下で利用したいpythonのバージョンを指定できます。以下に先ほどpoetryで作成したプロジェクトに移動し、そのプロジェクト内で指定するpythonのバージョンを指定するコマンドを記載します。

$ pyenv install 3.7.6
$ cd playground-analytics
$ pyenv local

$ python --version
Python 3.7.6

以下記事に基本利用方法が平易に書いてあるので、参考になります。
Pyenvの使い方 - Qiita

VScodeのインストール

こちらからダウンロードし、インストールしてください
Download Visual Studio Code - Mac, Linux, Windows

VScodeでpoetryで追加したモジュールを読み込めるようにする

このままpoetryでモジュールを追加していき、VScode上の.pyや.ipynb内で import したとしても読み込まれることはありませんので、以下Qiitaの記事の通りpoetryの設定を変更し、作成したプロジェクト内のvirtualenvに追加していく変更を行います。この変更をかけることでVScodeからpoetryで追加したモジュールの読み込みを行えるようになります。

$ poetry config virtualenvs.in-project true

VScodePythonインタプリンタにpyenvのPythonを追加

デフォルトの設定だとVScodePythonインタプリンタの参照先にpyenvで追加したPythonを利用する設定になっていないので、VSCodeの設定ファイルであるsettings.jsonpython.pythonPathに追加します。以下Qiita記事の「VSCodePython Interpreter の指定」の部分を参考にしました。

{
    "python.pythonPath": "/Users/anntoque/playground-analytics/.venv/bin/python3",
}

poetryでJupyter Notebookを追加

poetryはプロジェクト毎にモジュール管理ができるので、分析系のプロジェクトではjupyterを入れて、開発系のプロジェクトには入れないという選択が可能になります。 Jupyter Notebookを利用したい場合はjupyterモジュールの追加が必要ですので、追加しましょう。

$ poetry add jupyter@latest

VScodeでのJupyter Notebookの機能などは以下を参考にしてください。

完成!!とまとめ

以上で作業は終了です。pyenvでインストールしたPythonのバージョンを利用し、poetryでモジュール管理をpyproject.tomlで行い、VScode上でJupyter Notebookを利用することでインタラクティブな分析環境を構築することができました!!

f:id:ann-toque:20200508102216p:plain

構成の変更前と後の比較

  • エディタ:開発の時はVScode + 分析の時はJupyter Notebook →開発・分析どちらも VScode(Jupyter Notebook)
  • python環境:単一 → プロジェクト毎に複数バージョン利用
  • モジュール管理: 一括管理 → プロジェクト毎に管理

Appendix:他検討

JupyterLab

Jupyter Notebookにはないファイルの構成管理・デバッグなど行える環境もありますが、あくまでも分析向けな気がしています。
※ 利用したことがないのでイメージ違ったらすいません