見出し画像

Python3の仮想環境を操作するfishプラグインを作ってみた

TL;DR

virtualenvwrapper みたいな操作で venv を使える fish プラグインを作ったよ。使ってみてね。

Python と仮想環境と私

この何年か、プロジェクトによってプログラミング言語自体や使用するライブラリのバージョンを管理するために仮想環境が使われるようになっています。僕は以前は Python (2系と3系の両方)を使うことが多く、 virtualenvvirtualenvwrapper というツールをよく使っていました。

Python には仮想環境系のツールがいくつかあり、そのどれも名前がよく似ていて非常にややこしいです。僕は最近では Python 3 しか使わないようになっていて、 Python 3.3 からは標準ライブラリに入ったこともあり、 venv を使うようになりました。しかし、さほど頻繁には新しいプロジェクトの作成やプロジェクトの変更をしないため、なかなか操作が覚えられずに毎回自分で作ったメモを見ながら操作していました。

ターミナルとシェルと私

大昔のことですが、学生の時にコンピューターを使い始めた頃は特に意識することなく tcsh というシェルを使っていました。その後、 Linux や Mac で bash を使うようになって随分になります。なんとなく新しいものにしようかと思い若い同僚にアドバイスを求めたところ、最近のナウなヤングは fish を使っていると教えてもらい、自分もそれを使って若作りをしようと思ったのが去年の夏のことでした。

特に凝ったことをしていなかったのが幸いし、意外とすんなりと乗り換えられて会社でも自宅でも基本的に fish を使うようになって約1年となります。

そして出会い

僕は弁護士ドットコムに入社以来、仕事の大部分をクラウドサインの開発が占めていました。クラウドサインでは Go を使っていて、 Python を書くことはあまりありませんでした。この4月からは LegalTech Lab という部署に異動し、そこでは機械学習的なことや AI 的なことをしていくのでまた Python を書くことが増えています。そんな折、度々メモを見るのが面倒なので virtualenvwrapper のような操作を fish 上で行える venv-fish というプラグインを作ってみました。

インストール

venv-fish をインストールするには、 fish のプラグインの管理をする fisherman が必要になります。 fisherman 自体のインストールについてはリンク先を見てください。以下のコマンドで venv-fish がインストールできます。

> fisher add setomits/venv-fish

fisher 経由でインストールされたプラグインは

> fisher ls

で一覧されるので、ここに venv-fish があることを確認してください。
各種コマンドは virtualenvwrapper に倣っています。

環境の作成

> mkvenv ENVNAME

作業環境の変更

> workon ENVNAME

あるいはその環境を使うプロジェクトのディレクトリに移動してから引数なしで実行

> cd /path/to/projects/your-app
> workon

環境の削除

> rmvenv ENVNAME

環境の一覧

> lsvenv

まとめ

自分と同じように、 venv でいこうと思いつつも virtualenvwrapper の操作感が忘れられない人はぜひお試しください。そんなにすることはないけど、要望なんかをもらって気が向いたら対応するかもしれません。あるいはソースコードは Github で公開しているので、そちら経由で何かしてもらっても良いかもしれません。
https://github.com/setomits/venv-fish

おまけ

初期化について

今回 fish プラグインを作る際に一番困ったのは、プラグイン内で使う環境変数の設定とその読み込みでした。プラグインのコードを格納したディレクトリに初期化処理などを記した init.fish というファイルを配置しておくと、それがリネームされて ~/.config/fish/conf.d/ の下に配置されます。なお、このことは fisherman のドキュメントには書かれていなかったように思います。もはやどうやって気づいたのか定かではないのですが、多分 fisherman 自体のソースコードを読んで気づいたように思います。めでたしめでたし。

補完について

fish の良いところとして、「良い感じの補完」があると思います。コマンドを途中まで入力してタブキーをタイプするとその後が補完されたり、引数についてもタブキーのタイプでコマンドが扱うべきものだけが表示(例えば cd コマンドだとファイルはリストされずにディレクトリだけリストされるなど)されたりします。

fish ではコマンドごとに補完の定義ができます。例えば今回の venv-fish だと、環境を一覧する lsvenv では lsvenv を実行するディレクトにあるファイルやディレクトリが補完されて欲しくはありません。その場合は venv-fish/completions/lsvenv.fish のように

complete --command lsvenv --no-files

としておくことで、補完が抑制されます。また、 workon のときには作業環境だけが候補として補完して欲しいので venv-fish/completions/workon.fish のように

complete --command workon --arguments "(lsvenv)" --no-files

としておくことで、 lsvenv の結果を補完対象として表示することができます。

この記事が気に入ったらサポートをしてみませんか?