🐍

Python環境構築

2020/11/04に公開

WIP

Python環境構築まとめ

TL;DR

  • python3系以上 + pyenv + pipenv
  • anacondaは使わない
  • pipxも使わない

はじめに

Pythonで環境を作るときの個人的ベストプラクティスです。
より良いやり方が分かり次第、アップデートして行きたいです。
コメント、ご意見等お待ちしております。

この記事で扱わない内容

  • pythonそのもの機能など
  • 開発用ツール(エディタ、IDE等)

ゆくゆくは扱いたい内容(今はない)

  • poetry
  • docker等による低レイヤでの環境構築

概要

  • python 3系以降 (3.7以降で実証)
  • pyenv
  • pipenv

その他

  • Ubuntu20.04 or Ubuntu20.04(WSL2)

各要素の説明

python

2系はサポートが終了しているので、今から新たに始めるプロジェクトでは3系を使いましょう。

python3系のリリース状況、サポート期間については、公式サイトを確認しましょう。

参考:Moving to require Python3

pyenv

pythonのversionを管理してくれるツールです。同一のPCの中に異なるversionのpythonを同居させるときに使います。ディレクトリごとにどのversionのpythonを使うかを指定できます。この機能は、具体的にはshimというライブラリによってpathを透過的に書き換えることで実現されています。

pyenvをインストールするには、pyenvを直接インストールする方法とanyenvというツールを使う方法があります。python以外の言語でも~env系のバージョン管理ツールを使用する方はanyenvを導入し、そこから様々なバージョン管理ツールを導入すると楽です。(anyenvは必須ではありません。必要になったときに個別にパッケージ管理ツールを導入すれば同じです。)

pipenv

pythonの仮想環境作成,パッケージ管理をしてくれるツールです。

pyenvでpythonを導入しただけだと、同じversionのpythonでは、同じpipを使うことになります。すると、これらのプロジェクト間ではパッケージが共通になってしまいます。このため、プロジェクト間で異なるversionのパッケージを使い分けることが難しくなります。また、そもそもそのプロジェクトでは使わないパッケージがrequirements.txtに含まれることになります。

pipenvは高機能なpipのようなツールです。pipenvを使用すると、プロジェクトごとの実行環境を作成し、そのプロジェクトに必要なパッケージのみをインストールすることができます。

また、その他の細かい機能としては、プロジェクトごとの環境変数ファイル.envを実行時に自動でロードしてくれたり、開発時にのみ使うパッケージと本番環境でも使用するパッケージの区別等があります。

pyenvとの違いですが、pyenvで異なるversionのpythonをインストールし、そのうえでpipenvでプロジェクトごとに異なる環境を用意するイメージです。

使わないとしているツールについて

anaconda

anacondaは、pythonのversion管理やパッケージの管理、仮想環境作成までを統合的に行ってくれます。pythonパッケージでないライブラリ等の環境についても管理してくれます。
非常に便利ですが、

  • 管理する範囲が広すぎる (globalに環境を破壊しうる)
  • 権限が強すぎる (globalに環境を破壊しうる)
  • ディレクトリごとの切り替えができない (globalに環境を破壊しうる)
  • 他のツール(pyenv, pip, pipenv)と共存できない

といった点で、複数のプロジェクトで異なるversionのpythonを利用しているような環境下では、個人的にはあまり使いたくありません。このような環境で、anacondaレベルでの管理が必要になった場合は、むしろdockerを利用した方がメリットが大きいように感じます。

逆に、python version の切り替えがあまり無く、導入が大変なパッケージやライブラリ(例えばビルドが必要になるライブラリ)を利用するようなユースケースでは真価を発揮するように感じます。

pipx

pipexはglobalに使用しがちなツールを、プロジェクトをまたいでglobalにインストールしてくれるツールです。
pipxを使用したくなるシーンとしては、例えばjupyterが挙げられます。なんとなくデータの中身を触りたいようなプロジェクトで、プロジェクトに直接jupyterをインストールすることなく利用できるのは魅力的です。
しかし、pipx環境中で使われるパッケージ群は、pipx環境内で閉じているため、プロジェクト内で使用しているライブラリのバージョンと差異が生じることがあります。また、自分が使用している時には、まれにpyenvとの同居が上手くいかないケースが見受けられました。

こうしたことから、個人的には、pipxを用いずにプロジェクトに直接インストールするようにしています。

実際の手順

pyenv(anyenv) + pipenv という環境を作る手順です。

  1. anyenvのインストール
  2. pyenvのインストール
  3. pipenvのインストール

pyenvのインストールから始めます。(この段階でpythonは必要ありません)

wip

Discussion