とよぶ

歌いながらコード書いてます

virtualenvのpipでインストールしたFabricが実行できない件

今の業務で、Fabricを使ってサービスのリリース方法を改善しているところなんです。
夜に数時間ハマったにもかかわらず、次の日朝来たら一瞬で解決してしまうこの現象に名前を付けたい。

環境

CentOS 6.2

現象

リリース用のFabricスクリプトのリポジトリを作成している。
そのリポジトリのセットアップをするスクリプトが以下の順番で処理。

  1. 必要なパッケージ(gcc)のチェック(本当はpython-develもチェックしないといけない)
  2. グローバルにpipが無ければインストール
  3. グローバルにvirtualenvが無ければインストール
  4. リポジトリにvirtualenv用のディレクトリが無ければそのディレクトリに環境を作成して有効化
  5. pipで必要なパッケージをインストール ←問題はここ!!!

「リポジトリにvirtualenv用のディレクトリが無ければそのディレクトリに環境を作成して有効化」のところは以下の様なコードです。

virtualenv --distribute venv
. venv/bin/activate

で!問題の「pipで必要なパッケージをインストール」のところです。
「グローバルにpipが無ければインストール」ではグローバルのpipなので実行にsudoが必要です。
しかし、そのノリで「pipで必要なパッケージをインストール」でsudoをつけると、いくらactivateしていても
グローバルのpipでインストールされてしまう(っぽい〜)

stackoverflow.com

sudoをつけていても一見インストールされるのですが、fabを実行しようとするとエラーが出る。

Traceback (most recent call last):
  File "/usr/bin/fab", line 5, in <module>
    from pkg_resources import load_entry_point
  File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 2655, in <module>
    working_set.require(__requires__)
  File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 648, in require
    needed = self.resolve(parse_requirements(requirements))
  File "/usr/lib/python2.6/site-packages/pkg_resources.py", line 546, in resolve
    raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: paramiko>=1.10

完全にfabがグローバルのものを見てますね。
試しにpip listを実行してみると意図したパッケージが全くインストールされていないでしょう。

なので、virtualenv環境ではsudoを外してpip installを実行しましょう!
というお話でした。

なかなか解決しなかった訳

Mac OS X 10.9 Mavericksだと、setuptoolsの問題として既に既知のものとして似たようなものが公式のドキュメントやらStack Overflowにたくさん載っているわけで、疑うポイントがかなりずれてしまいましいた。。。
まあそもそもpipをなんとなく使っていたのがダメでしたがw

とはいえ、グローバルとローカルの問題ってわかってからは解決が早かったです。
こういう時はRubyでbundler使ってた経験が生かされますねwww