Hatena::ブログ(Diary)

kanonjiの日記 RSSフィード

http://kanonji.info/blog/ 2013年2月頃に移転しました。

2011-11-10

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 1.11.6 : Python Package Indexからダウンロードします。

補足

後述の読書会で見聞きした話によると、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の今後

f:id:kanonji:20111110123734j:image

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. WindowsのCUIにConsole2+nyoasがいいらしい
  3. PyPyはPythonで作られたPythonの処理系で、CPythonよりも早いらしい。わけが分からない。
  4. vimユーザー多数*2
  5. distutils, setuptools, distribute, pip, virtualenv, buildout 再掲 - 清水川WebPythonの環境構築に使うツールについては、ここがまとまりすぎ。
  6. 404 error - File Not Found

余談

第2章 構文ベストプラクティス ―― クラス以外

2.1 リスト内包表記

2.2 イテレータとジェネレータ

2.3 デコレータ

2.4 withとcontextlib

2.5 まとめ

エキスパートPythonプログラミング

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

とまぁ、内容が濃いので、2回目以降も見逃さず参加したいところです。月一という事なので、これを学習のマイルストーンにしてPythonを覚えたいです。

他の参加者のレポート

  1. 2011/11/08 エキスパートPythonプログラミング読書会2nd #1 - an album on Flickr
  2. 2011-11-09 - プログラマ行進曲第二章
  3. kashew_nuts-tech: エキスパートPythonプログラミング読書会 第二期 01に参加してきました
  4. エキPy読書会 第二期01参加しました No.1 - 絵事後素
  5. 今川館
他の参加者のレポートを追記。他にも見つけたら随時追加するかもしれません。

参考リンク

  1. エキスパートPythonプログラミング読書会 第二期 01 : ATND
  2. エキPy 読書会 - 清水川Web
  3. エキスパートPythonプログラミング読書会 第二期 01 まとめ - Togetterまとめ

環境

LinuxCentOS 5.6
pythonbrew1.1

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

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

shimizukawashimizukawa 2011/11/10 18:23 まとめblogありがとうございます! ちょっと補足を。

> なので、setuptoolsを入れられるのはちょっと困ります。

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

> virtualenv + distribute 環境下で buildout + distribute

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

> pipとeasy_installは混ぜるな危険

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


> コンパイルに、python以外のソフトウェアが必要なパッケージの場合、pipで入れようとするとコンパイル出来ずに失敗するんだとか。

python以外のソフトウェアが入っていれば問題は無い、とも言えます。これはWindowsでもLinuxでも。
とはいえ、Linux系でも時々、pipでPILをインストールしたらjpegやpngを扱えないPILがインストールされたという話を聞きます。

kanonjikanonji 2011/11/15 18:28 遅くなりましたが、補足ありがとうございます。せっかくなので、本文に引用形式でコピーしました。

聞いた話だけじゃなくて実際に使って体験しないと、なかなか書きにくいですね。pipとeasy_installのあたりも、読書会やコメントで教えてもらった事を心に留めつつ、体験して理解していこうと思います。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証