Python 開発環境の構成方法を考えた : pipenv のススメ

Python の開発環境をどう作ったらいいかなー、という話。

TL;DR : OS に Python3 系を入れて、プロジェクトディレクトリごとに pipenv で管理しろ。

目次

pyenv?virtualenv?venv?

複数の Python のバージョンをインストールするためのバージョン管理ツール。Node.js における Nodist や Nodebrew 的なヤツ。

歴史的経緯から色んなツールが存在するが、pyenv は v2 系向けとかで、venv が現在 Python 公式に含まれてる。

Python v3 系を OS に直接インストールする

色々調べたけど、めんどくせーから全部無視することにする。

Python v2 系はもう使わない。Python v3 系も、v3.7 あたりが1つ入っていれば良くて、複数の Python 本体のバージョンなんか管理しなくていい。Node.js だって、v5・v6 時代はゴチャついててめんどくさかったけど、今となっては v10 以降の適当なヤツが入ってればもう問題ないし、メジャーバージョンが変わったところで適当にバージョンアップして最新版だけ使ってればいいレベルだ。Nodist も Nodebrew も別に使うことはなくなったわ。

だから v3.7 系か v3.8 系か、適当なあたりのバージョンを OS に直接インストールする。

パッケージ管理は pipenv を使う

パッケージ管理ツールは pipenv というツールを使えば良い。コレがちょうど npm のように使える。

$ pip install pipenv

コレで pipenv をグローバルに使えるようにしておいたら、以降は pip コマンドは使わず、pipenv のみを使う。

次に、環境変数 PIPENV_VENV_IN_PROJECT を指定する。コレに true なり 1 なり値をしてしておくことで、プロジェクトディレクトリごとに仮想環境ファイルを格納できるようになる。

export PIPENV_VENV_IN_PROJECT=true

pipenv を使って新規プロジェクトの作成

それでは、pipenv を使って新規 Python プロジェクトを作成してみる。

$ mkdir python-example-project && cd $_
$ pipenv --python 3.7

使用する Python のバージョンを --python オプションで指定するだけ。こうすると、そのディレクトリに Pipfile というファイルができる。コレが npm における package.json 的な役割を担う。中身も読みやすいので見てみると良い。

依存モジュールをインストールしてみる

続いて pipenv を使って依存モジュールをインストールしてみる。例えば BeautifulSoup をインストールするとしたらこんな感じ。

$ pipenv install beautifulsoup4

こうすると Pipfile に依存モジュールの情報が書かれる他、Pipfile.lock という Lock ファイルも生成される。

[scripts] ブロックを使う

試しに example.py というファイルを作る。中身は適当で良い。普通に考えたら、このスクリプトは

$ python example.py

と実行して動かしたい。

コレも、pipenv を使うと、npm-run-scripts のように動かせる仕組みがある。

Pipfile を開き、以下のような行を追加する。

[scripts]
start = "python example.py"

そして、以下のようにコマンド実行すれば、npm-run-scripts のように実行できることが分かる。

$ pipenv run start

既存の pipenv プロジェクトを再現するには

ココまでは、プロジェクトを新規作成して拡張していく立場の人向けの話。ココからは、そうしたプロジェクトをローカルにクローンしてきて、開発に参加したい人の話。

プロジェクトをクローンしてきたら、以下のコマンドで npm install 同様に、依存パッケージを拾ってこられる。

$ pipenv install --dev

--dev を付けると開発向けのパッケージも取得できるので、開発者は付けておくと良い。

以上

「Python のバージョン管理をどうしたらいいか」というお題目に対して、「そもそも Python 本体のバージョンを管理する必要があるのか」を突き付け、「Python 本体の管理は不要!パッケージ管理を pipenv で一元化しろ!」で終えた。

pipenv がかなり npm と似た使い勝手なので、Node.js 民はとっつきやすいかなーと思う。