Blank File

LinuxとかPythonとかVimとか、趣味でいじる感じで

Pythonのパッケージ・仮想環境・プロジェクト管理ツールいろいろ

Pythonのパッケージや仮想環境、プロジェクトを管理するツールを色々紹介します。 自分用の備忘録も兼ねているので私のコメントにはかなり主観が入っています。

色々紹介しますが、基本的には pip と venv (virtialenv) で十分です。 これらで不便を感じていないのであれば、わざわざ他のツールを使う必要はないと思います。 不満を感じた時にその不満を解消するツールを試してみるのがいいのではないでしょうか。

免責事項: この記事の目的は「こういうのがある(らしい)よー」と文字通り紹介するだけで、特にどれかをオススメするという意図はありません。 似たようなツールで紹介できていないものも多々あると思います。 個別のツールの使い方も詳しくは紹介しません。 というか初めて名前を知ったものもあって使い方がよくわかってなかったりします。 とりあえず名前を挙げておいて、もしいい感じだったら誰か詳しい記事でも書いてくれないかなーくらいの気持ちで載せているものが半分くらいです。 なので試す際は自己責任でお願いします。

もし「こーゆーのほしかった!」というツールが見つかったという人がいれば望外の喜びです。 ぜひ良さをブログ等で宣伝してください。 (できれば使い方も(参考にさせていただきたいです))

標準ライブラリの2つ (pipとvenv)

pipとvenvはPythonに同梱されています。

pip

PyPIなどからPythonのパッケージをインストールするツールです。

これは説明不要ですね。 最近のpythonにはほぼ標準で入っています。 pipコマンドがないと言われたらpython -m ensurepipでインストールできます。

virtualenv/venv

仮想環境を作成します。 Python3.3くらいからvenvが標準ライブラリに含まれました。 実はvirtualenvとvenvでびみょ〜〜に違いがあったりした気がしますが、普通に使う分には違いを意識することはないと思います。

venvの場合は以下のコマンドで新しい仮想環境が作れます。 (pyvenvコマンドは非推奨になりました。)

python -m venv /path/to/venv

source /path/to/venv/bin/activateで仮想環境が有効になります。

プロジェクト別に環境を作ることで、各環境にインストールされるパッケージを分けることができます。 packageAの2.0以上が必要なのに別のプロジェクトではpackageAの2.0未満が必要、などという事態が未然に防げます。

Pythonのバージョン管理

pythonz

様々なバージョンのPythonをダウンロード・インストールできます。 インストールと言ってもビルドして特定のディレクトリに置かれるだけです。 デフォルトのpythonを切り替えるようなことはしません。

私はtox用に複数バージョンのpythonを用意するのにつかってます。

pyenv

複数バージョンのpythonと仮想環境をセットで管理してくれます。 有名なのでググると色々情報が出てくると思います。

私はほとんど使ったことがありません。 ちょっと1つのツールで色々やり過ぎのように感じられて好みではありませんでした。

p

こちらもpythonのバージョン切り替えらしいです。 使えるpythonが列挙されて選ぶのが楽そうです。

使ってないのでよくわかりません。

パッケージ管理

pipsi

pip代替?的なツールのようですが正直よくわかりません。

flaskの作者さん製。

仮想環境管理

virtualenvwrapper

virtualenvを使いやすくするコマンドを提供してくれます。

virtualenvで作った仮想環境を有効にするには source /path/to/bin/activate する必要がありましたが、これを使うと workon [仮想環境名] でactivateできるようになります。 また、仮想環境の作成(mkvirtualenv)や削除(rmvirtualenv)のコマンドもあり、管理しやすくなります。

私は一時期使っていましたが、最近はzsh-autoenvで自動的にactivateするようにしたので使わなくなりました。

inve (gist)

virtualenvの activate/deactivate を直接使わずに、特定の仮想環境でコマンド/シェルが実行できるようにするスクリプトです。

activate/deactivate の問題点について述べられています。

vex

上記のinveをパッケージにしてvirtualenvwrapperの仮想環境とひも付けた……のかな?

以下のように使うとコマンドが仮想環境で実行されます。

vex 仮想環境名 command

command のところを zsh 等にすれば仮想環境がactivateされたシェルが立ち上がるようです。 仮想環境はvirtualenvwrapperで作ったものを使うようです。

virtualenv/venvの activate は現在のシェルの PATH 等の環境変数を書き換えることで環境を切り替え、deactivate で元に戻すという動作ですが、vex (inveも) では仮想環境用のシェルを新しく立ち上げるのでシェルを閉じることで仮想環境から抜けます。

これは後述のpewやpipenvも同様の方針です。

pew

上記の vex + virtualenvwrapper に色々機能が増えた的なツールです。

現在の仮想環境の$PYTHONPATHディレクトリを追加するpew add [path]コマンドは便利そうだと思いました。 私は今はautoenvでパッケージ(プロジェクト)のルートを$PYTHONPATHに追加しています。

pipenv

Pipfileでパッケージと仮想環境をまとめて管理して便利コマンドがいくつかある感じでしょうか。

仮想環境を使うにはpipenv run commandでコマンドを実行するかpipenv shellでシェルを立ち上げて作業するかなので、方針としては前述のvex, pewと同じです。

inve -> vex -> pew -> pipenv と進化しているように感じました(実際どうなのかまでは調べていません)。

Pipfileで仮想環境にインストールされているパッケージが管理できるので、頻繁にサーバーにデプロイして実行するようなプロジェクトには便利かも?しれません。

また、pipには一旦インストールしたパッケージをuninstallしても依存してインストールされたパッケージは残ってしまうという問題がありますが、pipenvはpipenv updateすると一旦すべて削除してPipfileをみてインストールし直すようなので関係ないパッケージを手軽に綺麗に消すことができるようです。

個人的には使わない気がしますが、後々pipで使われる?というPipfileを使っているので動向が気になるところではあります。

※ Pipfile はtoml形式のpip用ファイルのフォーマット(として提案されている段階?)で、requirements-*.txt を1つのファイルにまとめることができます。バージョンのlockなどもありますが個人的にはrequirementsファイルをまとめられるのが一番うれしいです。

プロジェクト管理

cookiecutter

若干趣向がずれますが、後述のhatchで少し言及されていた&自分でも使ってるので紹介します。

プロジェクトの雛形を作ってくれるツールです。 これは仮想環境は関係ありませんが、フックがあるのでプロジェクトを作った後に対応する仮想環境も自動的に作る、といった使い方もおそらく可能です。

JavaScriptのyeoman、pythonでいうとsphinx-quickstartdjango-admin startprojectなどのようなものです。

プロジェクトのテンプレートはJinja2で書かれています。 極端に言ってしまえばファイルを作って配置するだけなのでPython以外のプロジェクトにも使えます。 cookiecutterのREADMEでは様々なテンプレートが紹介されています。

私は最近パッケージを新しく書き始める時に使っています。

poet

プロジェクト管理と仮想環境の管理を設定ファイル (poetry.toml) を基に色々してくれるようなことがREADMEに書いてありました。

The package is highly experimental

だそうです。

hatch

今回紹介したツールを全部まとめてさらにテストの実行やカバレッジ取得、PyPIへの登録などもできるツールらしいです。 昨日(2017/09/05)頃からGitHubのtrendingに挙がっていました。 すごい勢いでスターがついてます。

READMEでは以下のツールを置き換えると言っています。

  • Cookiecutter PyPackage
  • pip
  • virtualenv
  • pyenv
  • Pew
  • inve
  • pytest
  • Coverage.py
  • twine
  • bumpversion
  • zest.releaser
  • Incremental
  • python setup.py …

正直巨大すぎる気がします……。 redditでチラッと見た所(コンセプトについての)評判は良さそうでした。 まさに全部入りという感じなので、そういうのが好きな人には受けそうな気がします。

まとめ

大量に雑に紹介させていただきました。

ちょうどhatchが盛り上がっていて、pipenvの紹介記事も結構はてブがついていたのですこし調べてみましたが、思った以上に色々ありました。

色々紹介した後でこういうのもアレですが、冒頭でも書いたように基本的には pip と venv (virtialenv) で十分です。 まずはそれらを使ってみて、不満があったら他のツールを試してみるのがいいと思います。