Mac OS X に gevent をインストールする

Python のコルーチンベースのネットワークライブラリの gevent をインストールしようとしたら、壮大にエラーになった。

予め libevent を MacPorts から、

$ sudo pip install gevent
エラーが出力…

エラーメッセージが表示されてインストール失敗。

Complete output from command /opt/local/Library/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Contents/MacOS/Python -c "import setuptools; __file__='/Users/ohyanagi/build/gevent/setup.py'; execfile('/Users/ohyanagi/build/gevent/setup.py')" install --single-version-externally-managed --record /tmp/pip-hU_cKA-record/install-record.txt:
    Cannot guess the version of libevent installed on your system. DEFAULTING TO 1.x.x

とか書いてあるけど、libevent は MacPorts で libevent @1.4.14b をインストール済み。


MacPorts に gevent があるので、インストールしてみる。

$ sudo port install py26-gevent
--->  Computing dependencies for py26-gevent
--->  Dependencies to be installed: py26-greenlet py26-distribute
--->  Activating py26-distribute @0.6.13_0
Error: Target org.macports.activate returned: Image error: /opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin/easy_install already exists and does not belong to a registered port.  Unable to activate port py26-distribute. Use 'port -f activate py26-distribute' to force the activation.
Log for py26-distribute is at: /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_ports_python_py26-distribute/main.log
Error: The following dependencies failed to build: py26-greenlet py26-distribute
Error: Status 1 encountered during processing.
To report a bug, see <http://guide.macports.org/#project.tickets>

$ sudo port list installed | grep py26-distribute
py26-distribute                @0.6.13         python/py26-distribute

py26-distribute も入ってるのに…。


ググった結果、gevent の tar.gz をダウンロードして手動でインストールした。

$ python setup.py build -1 -I/opt/local/include -L/opt/local/lib
$ sudo python setup.py install 
Cannot guess the version of libevent installed on your system. DEFAULTING TO 1.x.x

とかって怒られたけど、サンプル動かしたら動いたから多分動いてるんだろう。

Python 2.6.5 (r265:79063, Jul  7 2010, 10:23:32) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import gevent
>>> from gevent import socket
>>> urls = ['www.google.com', 'www.example.com', 'www.python.org']
>>> jobs = [gevent.spawn(socket.gethostbyname, url) for url in urls]
>>> gevent.joinall(jobs, timeout=2)
>>> [job.value for job in jobs]
['64.233.189.104', '192.0.32.10', '82.94.164.162']

参考文献
Emerge Technology: geventをインストール
この情報がなかったらインストールできなかった。