Cygwinでeasy_installからのpipでgcalcli

ちょっとCygwinのコマンドラインからGoogleのカレンダーをいじりたくてgoogleclからちょいと、と思ったら動かない。こんなことになる。

Failed to get entries: {'status': 403, 'body': '<HTML>\n<HEAD>\n<TITLE>Forbidden</TITLE>\n</HEAD>\n<BODY BGCOLOR="#FFFFFF" TEXT="#000000">\n<H1>Forbidden</H1>\n<H2>Error 403</H2>\n</BODY>\n</HTML>\n', 'reason': 'Forbidden'}

docsは動くのでカレンダーがダメっぽい。ってなわけで他のを探したところgcalcliというカレンダーに特化したコマンドがあるらしい。
insanum/gcalcli · GitHub
しかしこれ、Cygwinのsetup.exeからはインストールできない。Cygwinではパッケージが提供されていないのだ。

というわけで、とりあえず試すのはソースからのインストール。Pythonパッケージのインストールは初めて。お決まりのパターンは、ソースをダウンロード、setup.pyでinstallを指定して実行するとインストールされるっぽい。やってみる。

$ python setup.py install
~~~略~~~
copying build/scripts-2.7/gcalcli -> /usr/bin
~~~略~~~

ん、/usr/bin/にインストールだと?そういうのは好きではない。そこはOSのパッケージ管理システムで管理したいところだ。他のところにしてくれ、できれば/usr/local/bin/にして欲しい。どうすりゃいいのか?と調べてみたら、configureスクリプトと同じようにprefixを指定できるらしい。

/usr/bin/python setup.py install –prefix=/usr/local
引用元: Python モジュールのインストール — Python 2.7ja1 documentation.

しかし、prefixを指定すると、ライブラリなんかもそっちにインストールされる。別に問題はないように思えるが、ちょっとある。pythonのデフォルトの検索パスに/usr/local/が含まれていないからだ。まー、環境変数を調整すればいいって話もあるけれど、pythonって個人的にはあまり使わないのでそういう設定とかしたくない。単純にコマンドは/usr/local/bin/に入ってくれればいいのだ。そういう人はこれを使えばいいっぽい。

scripts prefix/bin –install-scripts
引用元: Python モジュールのインストール — Python 2.7ja1 documentation.

うん、–install-scripts=/usr/local/bin/を指定するとgcalcliコマンドが/usr/local/bin/に入ってくれた。

さて、これでコマンドラインからGoogleカレンダーを、と思いきや、こんなエラーが。

ERROR: Missing module - No module named dateutil.tz

なんと。どうやらpython-dateutilというライブラリが必要らしい。ふむ。このまま必要なライブラリを都度入れていっても最後には動くようになるだろう。しかし、それは結構な時間の無駄だ。Pythonにもパッケージ管理の仕組みがあるはずだ。あった。
Pythonで一番最初に入れるべきパッケージ setuptools と pip – Life with Python.
Pythonを使う人は最初にsetuptoolsとpipというコマンドを入れておくらしい。ならば自分も。幸いCygwinにもsetuptoolsがpython-setuptoolsという名前で提供されている。とりあえず、それを入れる。setup.exeからなので楽チン。

お次はsetuptoolsに含まれるeasy_installコマンドでpipを入れる。しかしコマンドは/usr/local/bin/に入れたい。easy_installコマンドは、簡単に言うとPyPIというサイトからソースを取ってきてpython setup.py installするだけなので、何かしら指定すればできるはず。これだ。

–script-dir=DIR, -s DIR
引用元: Easy Install — Setuptools documentation.

こうなる。

$ easy_install --script-dir=/usr/local/bin/ pip

完璧。これでpipコマンドは/usr/local/bin/に配置された。

というわけで、目的のgcalcli。これも同様にこんな感じで指定する。

–install-option <options>
Extra arguments to be supplied to the setup.py install command (use like –install-option=”–install-scripts=/usr/local/bin”).
引用元: pip install — pip 6.0.8 documentation.

ご丁寧に求めているものが書いてあった。みんなそうしたいんだろうな。こうなる。

pip install --install-option="--install-scripts=/usr/local/bin" gcalcli

これでgcalcliは/usr/local/bin/に入ってくれた。

最後にgcalcliの動作確認。gcalcli listすると自分が関わっているカレンダーの一覧が出てくる。素晴らしい。

という感じなのだが、/usr/bin/は守るくせに/usr/lib/は守らないのかと指摘されそうなので反論しておくと、まー、反論するほどのポリシーはないのだが、/usr/lib/python2.7/site-packages/とか深いところは各言語に任せてもいいのかなと、そんなぐらいです。

以上。