なにこれ?
pipenvやpoetryを皆が使っている2021年に、とある目的にpyenv-virtualenvがぴったりということに気が付いたので、紹介します。
pyenv-virtualenv って何?
pythonの仮想環境構築ツールの一つです。pyenvの拡張機能です。通常のpyenvではpyenv local 3.8.7
のように、pyenv公式が用意したバージョン名を指定して環境を制御しますが、pyenv-virtualenvを使うとpyenv local saishinban
のように好きな環境名が指定でき、この環境名で環境を切り分けることができます。
Qiita内にpyenv-virtualenvの記事はたくさんあるので、これくらいの雑な説明にとどめます。より詳しく知りたくなったら、公式のREADMEや他の記事を参考にしてください。
何に気づいたの?
皆さんは、趣味や仕事で俺が考えた最強のCLIツールをpythonで書いていることでしょう。そして、今風に(2021年)poetry等を使ってパッケージ管理していることでしょう。そんなこんなでそれっぽいツールができてきたとしましょう。さて、このCLIツールはどうやって動かすのが良いでしょうか?
- dockerこそ至高
- 開発と同じpoetry/pipenvの環境をそのまま
- システムのpythonにえいやー
- その他
すぐ答えを言ってしまうと、4のその他で、pyenv-virtualenvがぴったりです。
ダメ出し(1,2,3)
まず、1,2,3のダメ出しすると次のようになります。
ケース | 問題点 |
---|---|
1. docker | CLIツールはローカルのディレクトリやファイル等を扱ったりすることが多く、マウント・権限管理が必要で、手間やリスク(下手に/ をマウントしてファイル全消し等)がつきまとう |
2. 開発と同じ | poetryやpipenvを使う場合、まずそのディレクトリに行ってから操作する必要があり、面倒(CLIの引数のパスの扱いも面倒) |
3. システム | 依存関係の管理はどこに行ってしまったのか・・・ |
まあ、気合で頑張ったりリスクを無視するのならできなくも無いですが、どれもやりたくは無いですね。
答え(pyenv-virtualenv)
次のようにpyenv-virtualenv環境を作成します。
$ pyenv install X.X.X # 好きなバージョンのインストール(すでにインストール済みなら不要)
$ pyenv virtualenv X.X.X mytoolenv
$ pyenv shell mytoolenv
$ pip install -e PATH/TO/mytool # ここで、あなたの最強のCLIツールをインストールします(poetryを使う場合setup.pyがなく、`pip install -e`が使えないため注意)
そして、適当にPATHの通ったディレクトリにツール名と同じ名前のファイルを作成し(例ではツール名がmytoolとします)、以下の内容を記述して実行権限を与えておきます。
#! /bin/bash
eval "$(pyenv init -)"
pyenv shell mytoolenv
mytool $*
これで、mytoolと叩くと、専用の仮想環境で動作させれます。setup.pyを排除したやり方を取っていて、pip install -e
が使えない場合は、インストールし直すスクリプトを用意するとはかどります。
この方法の魅力は、どのディレクトリにいてもツールが使え、それでいてそれなりの仮想環境(dockerほどではない)を準備できる点です。
まとめ
2021年でもpyenv-virtualenvを使うと良いケースがあります。似た悩みに直面している方は一考してみてください。