Pythonの環境構築の自分なりのまとめ+エキスパートPythonプログラミング読書会 第二期 01に行ってきました。

エキスパートPythonプログラミング読書会 第二期 01 : ATNDに行ってきました。補欠で7人目だったので無理かなと思ってたけど、結果としては補欠が全員繰り上がってぴったり30人となりました。実はエキスパートPythonプログラミングをまだ持ってなかったので、慌てて本屋を回って買ったという。

今回は「第1章 さあ、はじめよう」で、Pythonの環境を構築する章だったけど、ちょうど10月頃にPython製のプログラムを使ってみたくて、環境構築をしてみたとこだったのでいい話が聞けました。自分でやった環境構築と聞いた話をあわせて、とりあえず自分なりの環境構築をまとめてみます。

環境構築

pythonbrewを入れる
$ curl -L http://xrl.us/pythonbrewinstall | sh
pythonbrewでpythonを入れる
$ pythonbrew install --no-setuptools 2.7.2

--no-setuptoolsを付けない場合、pythonbrewはsetuptoolsとpipを合わせて入れるようです。pipはともかく、setuptoolsは開発が止まっていて代替として登場したdistributeを入れたほうがいいらしいです。なので、setuptoolsを入れられるのはちょっと困ります。

〓以下、追記〓

setuptoolsが入っている状態で easy_install distribute すれば大丈夫ですよ。
そうすればvirtualenvなども easy_install virtualenv で済むので良いですね。

http://d.hatena.ne.jp/kanonji/20111110/1320916100#c1320916990

id:shimizukawaさんにコメントで補足してもらいました。合計3つ補足を追記しました。
これは上書きとかになるのかな。今度試してみたい。

virtualenvでdistributeを入れつつ仮想環境を作る
$ pythonbrew use 2.7.2
$ python virtualenv.py --distribute ~/.pythonbrew/virtualenvs/python-2.7.2a
$ source .pythonbrew/virtualenvs/python-2.7.2a/bin/activate
(python-2.7.2a)
$ type python
python is /home/myuser/.pythonbrew/virtualenvs/python-2.7.2a/bin/python
$ type easy_install
easy_install is /home/myuser/.pythonbrew/virtualenvs/python-2.7.2a/bin/easy_install
$ type pip
pip is /home/myuser/.pythonbrew/virtualenvs/python-2.7.2a/bin/pip

virtualenvは--distributeを使うと、setuptoolsの代わりにdistributeを入れてくれます。まずpythonbrew use 2.7.2でpythonbrewで入れたpython 2.7.2に切り替え*1それを親としてpython-2.7.2aという仮想環境を作っています。distributeがセットで入ったので、easy_installが使える状態になります。

ちなみに、virtualenv.pyはvirtualenv · PyPIからダウンロードします。

補足

後述の読書会で見聞きした話によると、virtualenvで作った環境は、親にdistributeをインストール済みであれば、それを使うらしいです。そうすると、virtualenvで仮想化しつつdistributeを入れるより、pythonbrewで入れたpythonにdistributeを入れておいた方がすっきりするかもしれない。

個人的には virtualenv + distribute 環境下で buildout + distribute を使うのが良いように思います。

distutils, setuptools, distribute, pip, virtualenv, buildout 再掲 — 清水川Web

あと、buildoutというものもあるらしく、上記の通りvirtualenvで作った仮想環境にbuildoutを入れるという手があるみたいです。ただbuildoutが何だかわかって無いので、今度試してみたいところ。

〓以下、追記〓

buildoutを使うときは必ずしもvirtualenv環境下でなくても良いです。自分はbuildoutのみ使っています。
ただbuildoutの概念は超簡単、ではないので、必要になるまでは使わなくてもいいかも。

http://d.hatena.ne.jp/kanonji/20111110/1320916100#c1320916990

id:shimizukawaさんのコメントでの補足2。

読書会で見聞きした事

読書会で見聞きした事なので、もしかしたら聞き間違い・勘違いを含むかもしれません。

pipとeasy_installは混ぜるな危険

pipとeasy_installはインストールの形式が違うらしいです。

〓以下、追記〓

混ぜてもライブラリ機能的な影響はないですがeasy_installで入れたものはpip uninstallやpip freezeなどの対象になりません。
混ぜると利用者が混乱するので注意が必要です。

http://d.hatena.ne.jp/kanonji/20111110/1320916100#c1320916990

id:shimizukawaさんのコメントでの補足3。

〓追記ここまで〓

$ ls site-packages/blockdiag* -1
site-packages/blockdiag_sphinxhelper.py
site-packages/blockdiag_sphinxhelper.pyc
site-packages/blockdiag
site-packages/blockdiag-1.0.2-py2.7.egg-info

pipで入れた場合

$ls site-packages/blockdiag-1.0.2-py2.7.egg/
EGG-INFO blockdiag blockdiag_sphinxhelper.py blockdiag_sphinxhelper.pyc

easy_installで入れた場合

この様に、ファイルの置き方が違います。
あと、easy_installは.eggというファイルからパッケージを入れられるが、pipは出来ないとの事。これは.eggがコンパイル済みのファイルをzipで固めたもので、pipは必ずソースからコンパイルをする仕組みだという話を聞きました。コンパイルに、python以外のソフトウェアが必要なパッケージの場合、pipで入れようとするとコンパイル出来ずに失敗するんだとか。

virtualenvは仮想化に必要なファイルだけを作成し、残りは親を参照する

見出しの通り、らしいです。

$ virtualenv --no-site-packages my_env

site-packagesも親のを使うので、親から独立した仮想環境を作りたい場合は--no-site-packagesオプションをつける。これはsys.pathに親のsite-packagesへのパスが入るか入らないかになるとのことです。逆に、親のsite-packagesを利用していれば、仮想環境を作った後に親でパッケージをインストールすると、仮想環境でもそのパッケージが使える。ただ、例外もあるらしく、例えばipythonは親のを仮想環境で使うことが出来ないらしい。

pipとeasy_installの今後

http://shimizukawa.bitbucket.org/python-distribute-ja/introduction.html#state-of-packaging-info

setuptoolsとdistributeはdistutilsを拡張したもので、将来的にはPythonに取り込まれたdistutils2とpipを使う形になるっぽい。先の話なので、当面はdistributeのeasy_installを使うかpipを使うのがいいのかな。

その他
  1. Home - the bpython interpreter
  2. WindowsCUIにConsole2+nyoasがいいらしい
  3. PyPyはPythonで作られたPythonの処理系で、CPythonよりも早いらしい。わけが分からない。
  4. vimユーザー多数*2
  5. distutils, setuptools, distribute, pip, virtualenv, buildout 再掲 — 清水川WebPythonの環境構築に使うツールについては、ここがまとまりすぎ。
  6. http://sanojimaru.com/654

余談

第2章 構文ベストプラクティス ―― クラス以外
2.1 リスト内包表記
2.2 イテレータとジェネレータ
2.3 デコレータ
2.4 withとcontextlib
2.5 まとめ

サイト閉鎖のお知らせ | ASCII Books

次回に読むであろうエキPyの2章は、ぺちぱーからすると訳が分からない構文のオンパレードです。リスト内包表記は割と便利だなーって思いましたが、ジェネレーターとwithのあたりでさらっと読むだけじゃ理解出来なくなりました。こんなPythonならではを2章に持ってくなんて。しかも、今手元にないから確認は出来ないけど、withの所にいく前に、サンプルコードにwithがしれっと書いてあった様な・・・
とまぁ、内容が濃いので、2回目以降も見逃さず参加したいところです。月一という事なので、これを学習のマイルストーンにしてPythonを覚えたいです。

環境

Linux CentOS 5.6
pythonbrew 1.1

*1:useの場合は現在のシェルでのみ一時的に切り替え、switchで恒久的に切り替える。

*2:読書会の参加者を対象に挙手調査による。