macで蛇使い入門記:パッケージ管理

easy_install

さて、Pythonにおけるパッケージ(モジュール)管理システム*1はeasy_installって言う奴みたいです。このパッケージ管理システムもmacにデフォで入っていたり、Pythonの各バージョン用のものがあったり、となかなか複雑です。

ちょいと探しただけで、以下の3つが見つかりました。恐らくですが、右の括弧内に書いたそれぞれのpython用のものであろうと思います。

  • /usr/bin/easy_install (/usr/bin/python 用?)
  • /usr/bin/easy_install-2.5 (/usr/bin/python2.5 用?)
  • /usr/bin/easy_install-2.6 (/usr/bin/python2.6 用?)

py26-(setuptools|distribute)

とりあえず、python本体はmacportsで入れたpython26を使おうと思っているので、それ用のeasy_installを手に入れるべきな気がしました。そして、ここがまだよく分かってないのですが、easy_installを含むportsパッケージは「py26-setuptools」や「py26-distribute」という奴らしい*2です。

$ port search setuptools
py-setuptools @0.6c11 (python, devel)
    distutils enhancement for build and distribution

py25-distribute @0.6.14 (python, devel)
    Replacement for setuptools

py25-setuptools @0.6c11 (python, devel)
    distutils enhancement for build and distribution

py26-distribute @0.6.14 (python, devel)
    Replacement for setuptools

py26-setuptools @0.6c11 (python, devel)
    distutils enhancement for build and distribution

py27-distribute @0.6.14 (python, devel)
    Replacement for setuptools

py27-setuptools @0.6c11 (python, devel)
    distutils enhancement for build and distribution

py31-distribute @0.6.14 (python, devel)
    Replacement for setuptools

Found 8 ports.

ちょっと調べた情報は以下のような感じ。というわけで、とりあえず distribute 入れてみましょか。

  • 元祖はsetuptools
  • setuptoolsは最近メンテされていない、そして設計が古いらしい
  • 後追いで来たのがdistribute


前回、python25, python26, python31 の3種類をportsでインストールしたので、それぞれのdistributeをインストールしてみる。

$ sudo port install py25-distribute py26-distribute py31-distribute

easy_installの切替

何事もなく成功したような気がする。とりあえず、前回と同じ感じで図解!

Python本体は、python_selectでシャキシャキと切り替えられるけど、easy_installがついてこない。なので、シンボリックリンク /opt/local/bin/easy_install の行き先を自力で切り替える必要があるっぽい。やー、めんどいけど。初心者には対応方法がわからんので、とりあえずがんばれ俺。python26なので、 /opt/local/bin/easy_install-2.6 に向いていればおk。かな。

$ python_select -spython26
$ ll `which easy_install`lrwxr-xr-x  1 root  admin    31B 10 12 23:02 /opt/local/bin/easy_install@ -> /opt/local/bin/easy_install-2.6

easy_installの中身をのぞき見る

怖い物見たさで、easy_install のshebangを見てみる。

$ head -n1 `which easy_install`
#!/opt/local/Library/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Contents/MacOS/Python
$ /opt/local/Library/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Contents/MacOS/Python -V
Python 2.6.6

…どこ向いてんだよオイオイオイオイ。また新しいpython実行ファイルや。しかし一応v2.6.6っぽい…。いいのかな…。まぁ、いいことにしよう。

なぜなら…。

この環境は直接は使わない

この先話すことのちょいと先取りになるけども。JavaにおけるMaven(2 or 3)は、1つのライブラリ(例えばcommons-langとか)でも複数のバージョンをインストール*3することができる。

が、Pythonのライブラリ(モジュールというらしい)は、インストールすると、常にclasspath上に乗っかってしまって、いつでも参照できる状態になる。つまり、同じライブラリの複数のバージョンを同時にインストールできないのだと思う(ちょっと不安だw)。

そして一般的に、1つのマシン上に複数のPythonプロジェクト*4が同居することになる。各々のプロジェクトで、使いたいPythonのバージョンや、インストールしておきたいPythonモジュールの種類やバージョンは異なるだろう。

Javaでは、classpathに入れるjarの種類を切り替えればいいので、簡単に環境を切り替えられる。しかしPythonではそうはいかないのだ。それを回避するために、virtualenvという仕組みを使う。

プロジェクト毎に「仮想Python環境」を作って、その環境下で開発するのだ。ちなみに、「仮想Python環境」の反対語は「グローバルPython環境」って言うのかな。上記のeasy_installでモジュールをインストールすると、そのモジュールは「グローバルPython環境」に入る。そしてグローバル環境に入ったモジュールは*5仮想環境からも参照できる。できてしまう。まぁ、メリットなのかデメリットなのかは状況次第だが。

というわけで、あーんまりグローバル環境にモジュールをインストールしない方がいいんじゃないかな、と思っている。

さて、次回はvirtualenvの話をする、多分。恐らく。

*1:Linuxに対するyumとかaptみたいなもの。Javaで言うmvnが担ってる役割の一部。

*2:26ってのは対応するPythonのバージョンね。

*3:というかlocal repositoryに置いておくだけで、必要に応じてclasspathを通すだけだけど

*4:Java on EclipseにおけるEclipseJavaプロジェクトと同じような粒度

*5:仮想環境作成時に明示的に指定しない限り