brew update したら以下のように distribute と pip がなくなって、python が更新された。

適当に検索したら https://github.com/mxcl/homebrew/wiki/Homebrew-and-Python というドキュメントが見つかった。いままで easy_install とか pip でパッケージを入れると、$HOMEBREW を homebrew を入れたディレクトリとして、$HOMEBREW/Cellar/python/2.7.1/lib/python2.7/site-packages とか $HOMEBREW/Cellar/python/2.7.1/bin に入っていたけど、python のバージョンが変更される(2.7.1 から 2.7.2 に上がるとか)たびに入れなおしたり、シンボリックリンクしなおしたりする必要があるので、これからは $HOMEBREW/Cellar/python/{SOME_VERSION}/lib/python2.7/site-packages は $HOMEBREW/lib/python2.7/site-packages へのシンボリックリンクにして、$HOMEBREW/Cellar/python/{SOME_VERSION}/bin に入るものは $HOMEBREW/share/python に入れる、らしい。で、最後に「distribute と pip の Formula はなくなったけど、brewpython を入れると easy_install は入るから easy_install pip すれば pip も使えるョ!」みたいなことが書いてある。

というわけで、python の環境を作りなおした。

前の環境を消す

brew で入れたものを uninstall して、cleanup でリンク切れ?したシンボリックリンクを消したり空のディレクトリを消したりしておく。

$ brew uninstall pip distribute python
$ brew cleanup

一応 virtualenv も作りなおすことにしたので、消しておく。

$ rm -rf ~/.virtualenvs/*

基本環境を作る

brewpython を install する。

$ brew install python
==> Downloading http://www.python.org/ftp/python/2.7.1/Python-2.7.1.tar.bz2
######################################################################## 100.0%
==> ./configure --prefix=/Users/nulll/homebrew/Cellar/python/2.7.1 --enable-shared
==> make
==> make install
==> Downloading http://pypi.python.org/packages/source/d/distribute/distribute-0.6.15.tar.gz
######################################################################## 100.0%
==> /Users/nulll/homebrew/Cellar/python/2.7.1/bin/python setup.py install
==> Caveats
A "distutils.cfg" has been written, specifing the install-scripts folder as:
  /Users/nulll/homebrew/share/python

If you install Python packages via "python setup.py install", easy_install, pip,
any provided scripts will go into the install-scripts folder above, so you may
want to add it to your PATH.

Distribute has been installed, so easy_install is available.
To update distribute itself outside of Homebrew:
$ easy_install pip
$ pip install --upgrade distribute

See: https://github.com/mxcl/homebrew/wiki/Homebrew-and-Python
==> Summary
/Users/nulll/homebrew/Cellar/python/2.7.1: 4768 files, 82M, built in 3.3 minutes

distribute も一緒に入ったけど、このままだと使えないので $HOMEBREW/bin からシンボリックリンクする。以下、$HOMEBREW を ~/homebrew とする。

$ cd ~/homebrew/bin
$ ln -s ../share/python/easy_install ./

easy_install で pip を入れて、シンボリックリンクする。

$ easy_install pip
$ cd ~/homebrew/bin
$ ln -s ../share/python/pip ./

pip で mercurial を入れて、シンボリックリンクする。

$ pip install mercurial
$ cd ~/homebrew/bin
$ ln -s ../share/python/hg ./

pip で virtualenvwrapper を入れる。virtualenv も入るので、シンボリックリンクする(virtualenvwrapper が中で使う)。

$ pip install virtualenvwrapper
$ cd ~/homebrew/bin
$ ln -s ../share/python/virtualenv ./

.zshrc を修正する。

...
export HOMEBREW=$HOME/homebrew
...
export WORKON_HOME=$HOME/.virtualenvs
if [ -f $HOMEBREW/share/python/virtualenvwrapper.sh ]; then
  source $HOMEBREW/share/python/virtualenvwrapper.sh
fi
...

virtualenv を作って、numpy と scipy を入れる

下準備

numpy と scipy を使うための virtualenv を作る。

$ mkvirtualenv work --no-site-packages --distribute

virtualenv 切り替え。以下、$ の左側の括弧で、現在の virtualenv を表わす。

$ workon work
(work)$

後で numpy と scipy のテストを走らせるために pip で nose を入れる。

(work)$ pip install nose
numpy を入れる

brew で gfortran を入れる。

(work)$ brew install gfortran

pip で numpy を入れる。

(work)$ pip install numpy

どんな感じで build されたか show_config で見つつ、まともに動くか test する。

(work)$ python
Python 2.7.1 (r271:86832, Mar 30 2011, 22:36:37) 
[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> numpy.show_config()
lapack_opt_info:
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    extra_compile_args = ['-faltivec']
    define_macros = [('NO_ATLAS_INFO', 3)]
blas_opt_info:
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    extra_compile_args = ['-faltivec', '-I/System/Library/Frameworks/vecLib.framework/Headers']
    define_macros = [('NO_ATLAS_INFO', 3)]
>>> numpy.test()
Running unit tests for numpy
NumPy version 1.5.1
NumPy is installed in /Users/nulll/.virtualenvs/work/lib/python2.7/site-packages/numpy
Python version 2.7.1 (r271:86832, Mar 30 2011, 22:36:37) [GCC 4.2.1 (Apple Inc. build 5664)]
nose version 1.0.0
....
----------------------------------------------------------------------
Ran 3006 tests in 14.955s

OK (KNOWNFAIL=4, SKIP=1)
<nose.result.TextTestResult run=3006 errors=0 failures=0>

MacPorts だと ATLAS を入れたような記憶があるけど、外部ライブラリとして Apple 謹製の Accelerate, vecLib という BLAS っぽい?ものが使われているみたいなので、まあこれでいいんじゃないでしょうか。test も(KNOWNFAIL, SKIP があるけど)OK みたいだし。

scipy

参考: http://www.scipy.org/Installing_SciPy/Linux の Building everything from source with gfortran on Ubuntu (Nov 2010) 以下

pip で入れると外部ライブラリを見つけてくれないので、ソースを落としてきて site.cfg を書いて build して install する。外部ライブラリとして使うのは amd, umfpack だけにする。昔は fftw も使えたみたいだけど、最近はライセンスの関係で使え(使わ?)なくなったらしい。代わりに pyfftw というものが使えるらしいが、fft はわりとどうでもいいので、やめた。

amd, umfpack は SuiteSparse の一部なので、brew で suite-sparse を入れる。依存関係で、metis と tbb も入る。

(work)$ brew install suite-sparse

scipy のソースを落としてくる。

(work)$ curl -LsSf http://downloads.sourceforge.net/project/scipy/scipy/0.9.0/scipy-0.9.0.tar.gz | tar xvz
(work)$ cd scipy-0.9.0

以下のような site.cfg を書く。

[DEFAULT]
library_dirs = /Users/nulll/homebrew/lib
include_dirs = /Users/nulll/homebrew/include

[amd]
amd_libs = amd

[umfpack]
umfpack_libs = umfpack

以下のような構成になる。setup.py と同じディレクトリに site.cfg があれば、見てくれるらしい。

(work)$ ls
INSTALL.txt     MANIFEST.in     THANKS.txt      scipy           setupscons.py
LATEST.txt      PKG-INFO        TOCHANGE.txt    setup.py        site.cfg
LICENSE.txt     README.txt      doc             setupegg.py     tools

setup.py で build して、install する。

(work)$ python setup.py build
...
(work)$ python setup.py install
...

show_config と test の結果は以下のようになった。ちなみに、build したディレクトリで python インタプリタを起動して import scipy すると怒られる(怒られた)ので、適当なディレクトリに移動してからやった。

(work)$ python
Python 2.7.1 (r271:86832, Mar 30 2011, 22:36:37) 
[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import scipy
>>> scipy.show_config()
amd_info:
    libraries = ['amd']
    library_dirs = ['/Users/nulll/homebrew/lib']
    define_macros = [('SCIPY_AMD_H', None)]
    swig_opts = ['-I/Users/nulll/homebrew/include']
    include_dirs = ['/Users/nulll/homebrew/include']
umfpack_info:
    libraries = ['umfpack', 'amd']
    library_dirs = ['/Users/nulll/homebrew/lib']
    define_macros = [('SCIPY_UMFPACK_H', None), ('SCIPY_AMD_H', None)]
    swig_opts = ['-I/Users/nulll/homebrew/include', '-I/Users/nulll/homebrew/include']
    include_dirs = ['/Users/nulll/homebrew/include']
lapack_opt_info:
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    extra_compile_args = ['-faltivec']
    define_macros = [('NO_ATLAS_INFO', 3)]
blas_opt_info:
    extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
    extra_compile_args = ['-faltivec', '-I/System/Library/Frameworks/vecLib.framework/Headers']
    define_macros = [('NO_ATLAS_INFO', 3)]
>>> scipy.test()
Running unit tests for scipy
NumPy version 1.5.1
NumPy is installed in /Users/nulll/.virtualenvs/work/lib/python2.7/site-packages/numpy
SciPy version 0.9.0
SciPy is installed in /Users/nulll/.virtualenvs/work/lib/python2.7/site-packages/scipy
Python version 2.7.1 (r271:86832, Mar 30 2011, 22:36:37) [GCC 4.2.1 (Apple Inc. build 5664)]
nose version 1.0.0
......
----------------------------------------------------------------------
Ran 4722 tests in 85.832s

OK (KNOWNFAIL=18, SKIP=42)
<nose.result.TextTestResult run=4722 errors=0 failures=0>

amd, umfpack, lapack, blas で外部ライブラリが使われていることがわかる。test も KNOWNFAIL, SKIP があるものの、OK らしい。

まとめ

work という名前の virtualenv を作ったけど、働きたくない。