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をインストール
この情報がなかったらインストールできなかった。