A Way of Code

興味の赴くままに書き綴っていきます。

Mac OS X 10.7.3 Lionでpythonbrew, virtualenv, pip, buildoutなPython環境を構築する 第3回 仮想環境の構築

前回:http://toggtc.hatenablog.com/entry/2012/02/06/023652

Pythonの仮想環境を構築することで、Python本体がある実環境を汚さずに、好き放題ライブラリを詰め込んだ環境を作ることができます。
pythonbrewには、venvというvirtualenv, virtualenvwrapperのラッパーコマンドが用意されています。ここではvirtualenvを直接使わず、venvを使って仮想環境を構築します。なお、virtualenvはvenvコマンド経由で自動的にインストールされます。

以下、前回の環境構築が完了している前提で話を進めます。

1. デフォルトで使うPythonを設定する

virtualenvを使うとき、Python 2.*が必要になります。ここでは、バージョン2.7.2をデフォルトで使うPythonとして設定します。

$ pythonbrew switch 2.7.2

これによって次回からpythonコマンドを打つときに2.7.2が使われるようになります。

$ python --version
Python 2.7.2
# ちなみに、pipも2.7.2配下のものが使われるようになります
$ pip --version
pip 1.0.2 from /Users/toggtc/.pythonbrew/pythons/Python-2.7.2/lib/python2.7/site-packages/pip-1.0.2-py2.7.egg (python 2.7)

2. 仮想環境を作成する

pythonbrew venvコマンドを使って、2.5.6、2.7.2、3.2.2それぞれのバージョンの仮想環境を作っていきます。

(仮想環境でdistributeを使うための設定)
なお、virtualenvから作成される仮想環境がsetuptoolsではなくdistributeをセットアップするようにするためには、VIRTUALENV_USE_DISTRIBUTE環境変数を事前に設定しておきます。
(2012.01現時点ではvenv経由だとvirtualenvの--distributeパラメータを認識しないの、この方法を使います)

export VIRTUALENV_USE_DISTRIBUTE=true

(--no-site-packagesについて)
以降、仮想環境を作るときにオプションとして「--no-site-packages」を指定します。
このオプションは、作成対象の仮想環境が、そのベースとなった実環境のPythonにあるsite-packages(※)を参照しないようにするオプションです。このオプションにより、ベースとなる実環境に何らかの外部ライブラリを入れても、仮想環境には影響しないようにすることが出来ます。
※site-packagesディレクトリは、外部ライブラリ・モジュールを格納する場所です。

なお、virtualenv 1.7以降では、--no-site-packagesがデフォルトになります。
pythonbrew 1.1 (2012年1月最新)では、virtualenv 1.6.4を使用しています。

2.1 Python 2.5.6ベースの仮想環境 "py25"

まずはPython 2.5.6ベースの仮想環境"py25"を作成します。
最初にvenvコマンドを使ったときに、virtualenvが自動的にインストールされます。

$ pythonbrew venv create py25 -p 2.5.6 --no-site-packages
Downloading virtualenv.tar.gz as /Users/toggtc/.pythonbrew/dists/virtualenv.tar.gz
######################################################################## 100.0%
Extracting virtualenv into /Users/toggtc/.pythonbrew/etc/virtualenv
Creating `py25` environment into /Users/toggtc/.pythonbrew/venvs/Python-2.5.6
Already using interpreter /Users/toggtc/.pythonbrew/pythons/Python-2.5.6/bin/python
New python executable in /Users/toggtc/.pythonbrew/venvs/Python-2.5.6/py25/bin/python
Installing distribute....................................................................................................................................................................................done.
Installing pip...............done.

2.2 Python 2.7.2ベースの仮想環境 "py27"

次はpython 2.7.2ベースの仮想環境"py27"を作成します。デフォルトのpythonを2.7.2としているので、-p 2.7.2オプションは指定しなくてもよいです。

$ pythonbrew venv create py27 -p 2.7.2 --no-site-packages
Creating `py27` environment into /Users/toggtc/.pythonbrew/venvs/Python-2.7.2
Already using interpreter /Users/toggtc/.pythonbrew/pythons/Python-2.7.2/bin/python
New python executable in /Users/toggtc/.pythonbrew/venvs/Python-2.7.2/py27/bin/python
Installing distribute....................................................................................................................................................................................done.
Installing pip...............done.

2.3 Python 3.2.2ベースの仮想環境 "py32"

最後にpython 3.2.2ベースの仮想環境"py32"を作成します。python 3.2.2は前回、--with-pydebug付きでコンパイルしているので、出力が少し異なります。

$ pythonbrew venv create py32 -p 3.2.2 --no-site-packages
Creating `py32` environment into /Users/toggtc/.pythonbrew/venvs/Python-3.2.2
[26303 refs]
Already using interpreter /Users/toggtc/.pythonbrew/pythons/Python-3.2.2/bin/python
New python executable in /Users/toggtc/.pythonbrew/venvs/Python-3.2.2/py32/bin/python
Installing distribute.............................................................................................................................................................................................................................................................................................................................................................done.
Installing pip....................done.
/Users/toggtc/.pythonbrew/etc/virtualenv/virtualenv.py:577: ResourceWarning: unclosed file <_io.FileIO name=3 mode='rb'>
cwd=cwd)
/Users/toggtc/.pythonbrew/etc/virtualenv/virtualenv.py:648: ResourceWarning: unclosed file <_io.FileIO name=3 mode='rb'>
filter_stdout=_filter_setup)
[79713 refs]

ちょちょいと仮想環境が構築できました。venvのおかげで至れり尽くせりです。
次回はbuildoutを使ってみます。

次回 hello, buildout:http://toggtc.hatenablog.com/entry/2012/02/06/024326

Mac OS X 10.7.3 Lionでpythonbrew, virtualenv, pip, buildoutなPython環境を構築する 第2回 pythonbrewとPythonのインストール

前回:http://toggtc.hatenablog.com/entry/2012/02/06/023342

複数バージョンのPython + 仮想環境を実現するために、以下の構成を作っていきます。
今回は、pythonbrewとPythonのインストールです。
f:id:toggtc:20120206003116p:plain

1. 前提環境

  • Mac OS X 10.7.3 (Snow Leopardでもいける気がする)
  • Xcode 4.2.1
  • Apple GCC 4.2.1 (not llvm-gcc)
  • readline 6.2.2 (homebrewからインストール)
  • sqlite 3.7.9 (homebrewからインストール)
  • gdbm 1.10 (homebrewからインストール)
  • ビルドに耐える時間

なお、Pythonインストール時にネットワークを使ったテストコードが走るので、ファイアウォールはOFFにしておきます。

2. pythonbrew本体のインストール

(1) ダウンロード&インストール

$ curl -kL http://xrl.us/pythonbrewinstall | bash

インストール先は~/.pythonbrewにpythonbrewです。
他のインストール先にしたい場合は、本家サイト(https://github.com/utahta/pythonbrew)をご確認ください。

(2) 環境変数の設定

~/.bashrc(もしくは~/.zshrc)に以下の行を追加します。スクリプトのファイル名がbashrcになっていますが、zshでも動くとのこと。

$ vi ~/.bashrc
# 以下を追加
[[ -s $HOME/.pythonbrew/etc/bashrc ]] && source $HOME/.pythonbrew/etc/bashrc

(3) パスが通っているかの確認

$ pythonbrew version

バージョンが表示されればOKです。表示されない場合は、Terminalの新規タブか新規ウィンドウを開いて、もう一度実行してみてください。(.bashrcがロードされていない可能性があります)

3. Pythonのインストール

今回は、2.5.6, 2.7.2, 3.2.2の3つのバージョンをインストールします。パッチを当てる作業があるので、以降で示す手順はバージョンが異なるとうまく機能しないかもしれません。

なお、インストールオプションの詳細については、以下を参照してください。
参考:http://toggtc.hatenablog.com/entry/2012/02/05/074212

3.1 Python 2.5.6のインストール

任意のディレクトリで以下のコマンドを実行します。

$ pythonbrew install --verbose --configure="CC=/usr/bin/gcc-4.2 CXX=/usr/bin/g++-4.2 LDFLAGS='-L/usr/local/lib -L/usr/X11R6/lib' --with-bz2 --with-crypt --with-expat --with-md5 --with-ncurses --with-readline --with-sha --with-sqlite3 --with-ssl --with-zlib" 2.5.6

LDFLAGSを設定しておかないと、X11のライブラリを見つけられないので指定しておきます。

ちなみにpythonbrewから2.5.6をインストールすると、いろいろとパッチを当ててくれます。親切です。また、distributeとpipも同時にインストールされます。ありがたいですね。

3.2 Python 2.7.2のインストール

Lion環境の場合、pythonbrewから適用される2.7.2用のパッチだけでは不足なので、一旦、Python 2.7.2のtarボールをダウンロード&展開して、パッチを当ててからpythonbrew経由でインストールします。

手動で適用するパッチの一覧です。

(1) ダウンロード&パッチの適用
# まずはpythonのダウンロードと展開です。
$ cd /private/tmp
$ curl -kLO http://python.org/ftp/python/2.7.2/Python-2.7.2.tgz
$ tar xzf Python-2.7.2.tgz
$ cd Python-2.7.2/
# パッチを格納するディレクトリを作成して...
$ mkdir patches
$ cd patches
# パッチをダウンロードしていきます
$ curl -kLo gdbm-1.9.patch http://hg.python.org/cpython/raw-rev/14cafb8d1480
$ curl -kLO https://raw.github.com/toggtc/python-patch/master/2.7.2/distutils_test_fixup_command_2.7.2.patch
$ curl -kLo test_platform.patch http://hg.python.org/cpython/raw-rev/0a53a978a160
# パッチを当てていきます
$ cd ../
$ patch -p1 < ./patches/gdbm-1.9.patch
patching file Lib/whichdb.py
patching file Misc/NEWS
Hunk #1 FAILED at 76.
1 out of 1 hunk FAILED -- saving rejects to file Misc/NEWS.rej
$ patch -p1 < ./patches/distutils_test_fixup_command_2.7.2.patch
patching file Lib/distutils/tests/test_build_ext.py
$ patch -p1 < ./patches/test_platform.patch
patching file Doc/library/platform.rst
patching file Lib/platform.py
patching file Lib/test/test_platform.py
patching file Misc/NEWS
Hunk #1 FAILED at 101.
1 out of 1 hunk FAILED -- saving rejects to file Misc/NEWS.rej

パッチを当てるとMisc/NEWSのパッチあてに失敗しますが、影響はないので無視します。

これで下ごしらえができました。

(2) インストール

pythonbrewから下ごしらえしたPythonをインストールします。

$ pythonbrew install --verbose --universal --configure="CC=/usr/bin/gcc-4.2 CXX=/usr/bin/g++-4.2 LDFLAGS='-L/usr/local/lib -L/usr/X11R6/lib'" /private/tmp/Python-2.7.2/

Python 2.5.6のときは--with-*をたくさん指定しましたが、2.7.2ではunrecognized optionsとなってしまうので、ここでは指定しません。ビルドログをみると各モジュールがビルドされているようなので、ライブラリを探索して自動的にビルドしているのではないかと思います。

これでPython 2.7.2のインストールが完了しました。

3.3 Python 3.2.2のインストール

2.7.2のときと同じく、事前にtarボールをダウンロード・展開して、パッチを当てておきます。

適用するパッチ: ※2.7.2のときとURLが異なるので注意してください

(1) ダウンロード&パッチの適用

では、pythonのソースをダウンロードしてパッチを当てます。

$ cd /private/tmp
$ curl -kLO http://python.org/ftp/python/3.2.2/Python-3.2.2.tgz
$ tar zxf Python-3.2.2.tgz
$ cd Python-3.2.2
$ mkdir patches
$ cd patches
$ curl -kLo gdbm-1.9.patch http://hg.python.org/cpython/raw-rev/7a41855b6196
$ curl -kLo fixup.patch http://hg.python.org/cpython/raw-rev/6f6100a752ba
$ cd ../
$ patch -p1 < ./patches/gdbm-1.9.patch
patching file Lib/dbm/__init__.py
patching file Misc/NEWS
Hunk #1 FAILED at 55.
1 out of 1 hunk FAILED -- saving rejects to file Misc/NEWS.rej
$ patch -p1 < ./patches/fixup.patch
patching file Lib/distutils/tests/support.py
Hunk #1 succeeded at 189 (offset 1 line).
Hunk #2 succeeded at 203 (offset 1 line).
patching file Misc/NEWS
Hunk #1 FAILED at 113.
1 out of 1 hunk FAILED -- saving rejects to file Misc/NEWS.rej
(2) インストール

下ごしらえができたので、インストールします。
なんとなく3系なので、--with-pydebug付きでビルドします。デバッグメッセージが出たり、なんとなくモッサリ気味になるので不要な場合は外してください。

$ pythonbrew install --verbose --universal --configure="CC=/usr/bin/gcc-4.2 CXX=/usr/bin/g++-4.2 LDFLAGS='-L/usr/local/lib -L/usr/X11R6/lib' --with-pydebug" /private/tmp/Python-3.2.2/

これでpython 3.2.2のインストールが完了しました。

3.4 symlinkを貼る(おまけ)

任意のディレクトリで、以下を実行。

$ pythonbrew symlink

これによって、~/.pythonbrew/bin直下に、py*というリンクが貼られます。

$ ll
py2.5.6 -> /Users/toggtc/.pythonbrew/pythons/Python-2.5.6/bin/python
py2.7.2 -> /Users/toggtc/.pythonbrew/pythons/Python-2.7.2/bin/python
py3.2.2 -> /Users/toggtc/.pythonbrew/pythons/Python-3.2.2/bin/python

pythonbrewインストール時に、~/.pythonbrew/binのパスが環境変数PATHに追加されているので、py2.7.2と打つことで、python 2.7.2のインタプリタを起動できるわけです。

$ py2.7.2
Python 2.7.2 (default, Jan 25 2012, 14:51:41) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 

うーん、便利!

3.5 pythonbrewを使ってみた感想

バージョンを指定してインストール・アンインストールできるのがいいですね!homebrewでは細かいバージョンの管理や切り替えは想定していないようなので、Pythonのインストールはpythonbrewで行うことをお勧めします。
ただ、Pythonをインストールするにあたって、2つほど気になったところがありました。

(1) pythonbrewのパッチの仕組みはもう少し柔軟性が欲しい
パッチを当てようとすると、今回のインストールでやったようにソースとパッチをそれぞれダウンロードして、個別にパッチを当てる必要があります。
仕組みとしては~/.pythonbrew/patchesディレクトリがあるので、そこにパッチを格納すれば自動でパッチを当ててくれるか、あるいは、パッチリストのテキストファイルを置いておけば自動でダウンロード&パッチ当てまでしてくれると手間がなくていいですね。

(2) 複数のバージョンをインストールしたときに、最後のビルドログが上書きされてしまう
Pythonのビルドログには、どのモジュールがビルドされなかったか等の重要な情報があるため、Pythonを動かしているときになんらかの不具合があったとき、ビルドに原因があった、なんていうケースが出てくるかもしれません。そんなとき、ログが残っていると嬉しいのですが、pythonbrewはビルドログを上書きしてしまうので、インストール完了時に別名保存しておいたほうがいいですね。

なんにせよ、初心者にとってはシステムのPythonを汚さないサンドボックスかつバージョンが切り替えられる環境が手に入るのは嬉しいことです。今後もユーザ(デベロッパー)フレンドリーなツールが充実してくるといいですね。
次回は仮想環境の構築をしていきます。

次回 仮想環境の構築:http://toggtc.hatenablog.com/entry/2012/02/06/023807

Mac OS X 10.7.3 Lionでpythonbrew, virtualenv, pip, buildoutなPython環境を構築する 第1回 はじめに

そうだ、Pythonをやろう
と思ったけど、Python 3とPython 2には後方互換がありません。それならPythonのバージョンを切り替える仕組みが欲しいですね、ってことで調べてみたところ、pythonbrewとvirtualenvを組み合わせて使い、ライブラリの管理・インストールはpipもしくはdistributeを使い、ビルドシステムとしてbuildoutを使う、というのが良さげです。

ということで、MacでPythonまわりの開発環境を作ったときのメモです。

第1回 はじめに (この記事):
http://toggtc.hatenablog.com/entry/2012/02/06/023342
第2回 pythonbrewとPythonのインストール:
http://toggtc.hatenablog.com/entry/2012/02/06/023652
第3回 仮想環境の構築:
http://toggtc.hatenablog.com/entry/2012/02/06/023807
第4回 hello, buildout:
http://toggtc.hatenablog.com/entry/2012/02/06/024326

pythonbrew? virtualenv??

Pythonは現状ではパッケージ管理の仕組みがいろいろとあって、どれも決め手に欠けるのですが、将来的にはpackaging(distutils2)というものに置き換わっていくようです。
f:id:toggtc:20120127001317p:image

どんなことが出来るの?

pythonbrew, virtualenv, buildoutを組み合わせてどんなことができるのか?を妄想してみました。
f:id:toggtc:20120206000528p:plain
この例では、2.5.6の環境はGAEアプリ開発用として構築しています。ここでは2.5.6の環境はGAEアプリ用にしか使わないので、仮想化せず実環境を直接利用しています。ただし、buildoutを使っているので、Python本体の環境を汚しません。
2.7.2の環境は、Webサービスクライアントの開発と科学計算モジュールの開発に使うので、それぞれの用途別に2.7.2環境を"py27_web", "py27_sci"として仮想化しています。仮想環境として分けているため、"py27_web"と"py27_sci"はお互いに独立しています。
3.2.2の環境は、仮想化した"py32_lib"をライブラリAの開発用とし、実環境側をライブラリBの試験用として実際にインストールすること等を想定してみました。

素人考えなので突っ込みどころが満載かもしれませんが、仮想環境を作ることで柔軟性が増すということがイメージできれば幸いです。

次回 pythonbrewとPythonのインストール:http://toggtc.hatenablog.com/entry/2012/02/06/023652

pythonbrewのコマンドとオプション一覧

pythonbrewからPythonをビルドしたときのconfigureオプションを調べていたら、網羅的にpythonbrewのオプションがみたくなって、いつの間にかpythonbrewのコマンドとオプションをまとめていました。
`pythonbrew help [COMMAND]`で確認できる内容がほとんどですが、自分用なので後悔はしていない。

対象

  • pythonbrew 1.1
  • Mac OS X (installコマンドの一部)

コマンド一欄

コマンド 説明
install 指定したバージョンのPythonをインストールする
uninstall 指定したバージョンのPythonをアンインストールする
cleanup ビルド時のファイルやPythonのtarボール等、不要になったファイルを削除する
switch 使用するPythonのバージョンを切り替える
use 現在のターミナルセッションに対して使用するPythonのバージョンを切り替る
off pythonbrewを無効にする
symlink 各バージョンのPythonに対するシンボリックリンクを作成する
py 指定したPythonファイルを、特定もしくは全てのPythonで実行する
update pythonbrew本体を更新する
version pythonbrew本体のバージョンを表示する
help 各コマンドのヘルプを表示する
buildout pythonbrew経由でbuildoutを実行する
venv 仮想環境の作成・削除・切り替え等を行う(サブコマンドあり)

install

指定したバージョンのPythonをインストールする。
※Mac固有と思わしき箇所は、緑色で記載しています。

使い方

$ pythonbrew install [OPTIONS] VERSION

installコマンドでデフォルトで指定されるconfigureオプション

  • MACOSX_DEPLOYMENT_TARGET=Mac OS Xのバージョン
  • ーーenable-shared

configureオプションが気になるかたは、Pythonのtarボールを展開して./configure --helpと./Mac/READMEをみると参考になるかと思います。
なお、AppleGCCではデフォルトで-fPIC等を付けるので、configureのオプションパラメータを調整するときはそのあたりも考慮するとよいでしょう。

installコマンドのオプション

オプション 短縮形 内容
--force -f make testに失敗してもインストールを続行する
--no-test -n make testをスキップする
--verbose -v 詳細情報を出力する
--configure -C ./configureのオプションを指定する
--no-setuptools setuptoolsをインストールしない
--as インストールするPythonの識別名をバージョン番号ではなく任意の名前にする
--jobs -j ビルドを並行処理させる
--framework 配置構成をMacOSXのFramework仕様にする
--universal 32bit と 64bitでビルドする
--static 共有ライブラリではなく、スタティックライブラリを作成する
--force

make testに失敗してもインストールを続行する

--no-test

make testをスキップする

--verbose

詳細情報を出力する

--configure

./configureのオプションを指定する
例:

$ pythonbrew install --configure="CC=/usr/bin/gcc-4.2" 2.7.2

configureに渡されるパラメータ:
指定された値がそのまま渡される。

./configure CC=/usr/bin/gcc-4.2
--no-setuptools

setuptoolsをインストールしない

--as

インストールするPythonの識別名をバージョン番号ではなく任意の名前にする
例:

$ pythonbrew install --as="hoge" 2.7.2 => ~/.pythonbrew/pythons/Python-hoge/
$ pythonbrew switch hoge
--jobs

ビルドを並行処理させる。makeのパラメータに渡される
例:

$ pythonbrew install -j2 2.7.2
--framework

配置構成をMacOSXのFramework仕様にする
configureに渡されるパラメータ:

--enable-framework=~/.pythonbrew/pythons/Python-xxx/Frameworks
--universal

32bit と 64bitでビルドする。ただし、対象のPythonバージョンによっては64bitコンパイルできないものもある
configureに渡されるパラメータ:

--enable-universal-sdk=/
--with-universal-archs=intel

※--enable-universal-sdkはMac固有のパラメータ。

--static

共有ライブラリではなく、スタティックライブラリを作成する。--enable-sharedオプションが指定されなくなる。--frameworkオプションとの併用はできない。

uninstall

指定したバージョンのPythonをアンインストールする。
指定したバージョンに紐付く、venvコマンドで作成した仮想環境も同時に削除される。

使い方

$ pythonbrew uninstall VERSION

cleanup

ビルド時のファイルやPythonのtarボール等、不要になったファイルを削除する。

使い方

$ pythonbrew cleanup

switch

使用するPythonのバージョンを切り替える。ターミナルのセッションをまたいで有効になる。

使い方

$ pythonbrew switch VERSION

use

現在のターミナルセッションに対して、使用するPythonのバージョンを切り替る。

使い方

$ pythonbrew use VERSION

off

pythonbrewを無効にする。
再びpythonbrewを有効にする場合は、switchコマンドを使用する。

使い方

$ pythonbrew off
$ which python
/usr/bin/python
$ pythonbrew switch 2.7.2
Switched to Python-2.7.2
$ which python
/Users/foo/.pythonbrew/pythons/Python-2.7.2/bin/python

symlink

各バージョンのPythonに対するシンボリックリンクを作成する。

使い方

$ pythonbrew symlink [OPTIONS]

symlinkコマンドのオプション

オプション 短縮形 内容
--python=VERSION -p VERSION 指定したバージョンのシンボリックリンクを貼る
--remove -r シンボリックリンクを削除する
--default=DEFAULT -d DEFAULT 指定したバージョンに対して"py"というデフォルト名でシンボリックリンクを貼る
--venv=VENV -v VENV 指定した仮想環境に対してシンボリックリンクを貼る?(試したら動かなかった)

py

指定したPythonファイルを、特定もしくは全てのPythonで実行する。

使い方

$ pythonbrew py PYTHON_FILE

pyコマンドのオプション

オプション 短縮形 内容
--python=VERSION -p VERSION 指定したバージョンでPythonを実行する
--verbose -v 各バージョンのPythonを実行するとき、そのPythonのバージョンを表示する

使用例

# 全てのバージョンのPythonで実行する
$ pythonbrew py foo.py
# 指定したバージョンのPythonで実行する
$ pythonbrew py -p 2.7.2 -p 2.5.6 foo.py

update

pythonbrew本体を更新する。

使い方

$ pythonbrew update

version

pythonbrew本体のバージョンを表示する。

使い方

$ pythonbrew version

help

各コマンドのヘルプを表示する。

使い方

$ pythonbrew help [COMMAND]

buildout

buildoutを実行する。buildout.cfgが格納された位置で実行する。

使い方

$ pythonbrew buildout

venv

仮想環境の作成・削除・切り替え等を行う。

使い方

$ pythonbrew venv [OPTIONS] [SUB_COMMAND] [VIRTUAL_ENV_NAME]

venvコマンドのサブコマンド

create

仮想環境を作成する。
環境変数VIRTUALENV_USE_DISTRIBUTE=trueと設定しておくと、仮想環境ではsetuptoolsではなくdistributeがセットアップされる。
例:

# switchで有効にしたバージョンのPythonをベースに、仮想環境py27を作成する
$ pythonbrew venv create py27
# 2.5.6のバージョンをベースに、仮想環境py25を作成する
$ pythonbrew venv create -p 2.5.6 py25
# 2.7.2環境のsite-packageから独立した仮想環境py27_independentを作成する
$ pythonbrew venv create -p 2.7.2 --no-site-package py27_independent
# distribute付きの仮想環境py27_distributeを作成する
$ VIRTUALENV_USE_DISTRIBUTE=true pythonbrew venv create py27_distribute
delete

指定した仮想環境を削除する。
例:

# 実環境2.7.2ベースの仮想環境py27, py27_independent py27_distributeをまとめて削除する
$ pythonbrew venv delete py27 py27_independent py27_distribute
# 実環境2.5.6ベースの仮想環境py25を削除する
$ pythonbrew venv delete -p 2.5.6 py25
use

指定した仮想環境を使用する。
仮想環境を終了するには`deactivate`コマンドを実行する。
例:

# 2.5.6ベースの仮想環境py25を使う
$ pythonbrew venv use -p 2.5.6 py25
# py25仮想環境を終了する
$ deactivate
# 2.7.2ベースの仮想環境py27を使う
$ pythonbrew venv use py27
# py27仮想環境を終了する
$ deactivate
list

仮想環境のリストを表示する。
例:

$ pythonbrew list -a

サブコマンドのオプション

サブコマンド オプション 短縮形 内容
create, delete, use, list --python=VERSION -p VERSION 指定したバージョンでvenvサブコマンドを実行する
list --all -a 全ての仮想環境の一覧を表示する
create --no-site-package -n 仮想環境から、実環境のsite-packageを参照しない。

Pythonのバグサイト(bugs.python.org)にバグをレポートしてみる

Python 2.7.2のインストールでエラー(*)が出て、一部公式パッチが見当たらなかったので、PythonのIssue Trackerにバグを投稿してみました。
またお世話になりそうなので、メモしておきます。

(*)エラーの詳細→http://toggtc.hatenablog.com/entry/2012/01/29/014540

アカウントの作成

ここでアカウントを登録します。
http://bugs.python.org/

OpenIDを使ってログインするか、ページ左側の「Register」というリンクから辿ってアカウントの登録を行います。
アカウントの登録を行う場合、以下の項目を入力します。

項目 内容
Name 名前
Login Name* ログイン名(アカウントID)
Login Password* ログインパスワード
Confirm Password* パスワードの確認
Phone 電話番号
Organisation 所属組織
E-mail address* Eメールアドレス
Alternate E-mail address, One address per line その他のEメールアドレス

(*は必須)

投稿する、その前に

「Search」のリンクから、既に同じ内容のIssueが投稿されていないか検索しましょう。
Issueが重複すると、中の人にとっては負担になってしまいます。最新版リリース後にパッチが作られているかもしれないので、対象バージョンのリリースより前まで遡って調べたほうがいいでしょう。
またバグかどうかよく分からないものは、メーリングリストに投稿するという手もあります。
http://mail.python.org/mailman/listinfo

投稿する

ログインしたら、http://bugs.python.org/の左側に、「Create New」という項目が表示されます。
f:id:toggtc:20120203044703j:plain

「Create New」のリンク先を開くと、Issueの編集画面が表示されます。
f:id:toggtc:20120203044835j:plain

各入力項目をみていきます。

classification: 分類

設定した分類が間違っていたら、親切な中の人が修正してくれます。

  • Title:件名
  • Type:種別
    • no selection: 未選択
    • behavior: 挙動、調子
    • crash: クラッシュ
    • compile error: コンパイルエラー
    • resource usage: リソースの取り扱い =>リソース枯渇しやすいコードだとか、メモリ解放してないとか
    • security: セキュリティ
    • performance: パフォーマンス
    • enhancement: 強化 => 機能強化とか品質強化、ですかね
  • State:状態 =>初期は設定不可
  • Components:コンポーネント =>問題の対象となっているPythonコンポーネントを選択します(複数選択可)
  • Versions:バージョン =>なるべく、他のバージョンでも再現するかチェックしておくといいですね

process: 進行状態

processの欄には、主にバグ等Issueの内容を記入します。

  • Assinged To: Issueの割当先。権限のあるメンバでないと変更できない、っぽい
  • Nosy List: このIssueの更新が通知される人のリスト、のようです
  • Priority: 優先度。権限のあるメンバでないと変更できない、っぽい
  • keywords: キーワード。権限の(ry
  • Comment: コメント
    • バグ報告の場合、英語が苦手ならログを送るだけでいいと思いますが、前提となる環境や条件は明記しておきましょう
  • File: 添付ファイル
    • 添付ファイルは1つしか付けられないようです。なるべくpythonの外にあるサイトのURLは貼らないほうがよさそうです。リンク切れするといけないので。(私はついやってしまいましたが、、)
  • File Description: 添付したファイルの内容
  • Remote hg repo: Pythonリポジトリにあるパッチ等のパスを入れるみたいです

バグレポートを書くときの注意点

以下のページが参考になります。

ウノウラボ
良いバグレポートの書き方
http://labs.unoh.net/2006/05/post_13.html

MOZILLA DEVELOPER NETWORK
Bug writing guidelines
https://developer.mozilla.org/ja/Bug_writing_guidelines

特に障害解析をする側の立場から見ると、事象が発生する条件は大事ですよね。

投稿したもの

パッチが見当たらなかったのでドキドキしながら無邪気に投稿してみたもの。
http://bugs.python.org/issue13901

今回はパッチを自分なりに作って投稿してみました。
MacユーザUZEEEEってdisられるかな、と思ったのですが、ビルドエキスパートonMacなNed氏にさっそくパッチを修正していただきました。さらにMacでのバイナリ特性についても説明していただいて、感動でした。Thanks, Ned!
修正していただいた内容だとLinux環境でも同じ事象が起こるんじゃないかと思い、試してみたのですが、pure GCCは-L(空白)を許容してApple GCCは許容しませんでした。というわけで、Ned氏の修正の方が正しいですね。(ディスクの空きがなくて、Linux+GCC 4.2環境を作るのに手こずっちゃった。)
今回の修正は、Python 2.7.3, 3.2.3でリリースされるようです。楽しみですヽ(´ー`)ノ

コミュニティーに参加すると刺激があって良いですね。Pythonをいじっていたはずなのに、Macのバイナリにもっと詳しくなろうとか、英語を上達させようとか思えてきますから。

test_get_outputsで実行されるgccコマンドのGNU's GCCApple's GCCの違いをメモ:

#
# configure
#
# on Linux (GNU's GCC)
./configure CC=/usr/local/bin/gcc CXX=/usr/local/bin/g++ --enable-shared --enable-unicode=ucs4
# on Mac (Apple's GCC)
./configure CC=/usr/bin/gcc-4.2 CXX=/usr/bin/g++-4.2 LDFLAGS='-L/usr/local/lib -L/usr/X11R6/lib --enable-shared MACOSX_DEPLOYMENT_TARGET=10.7
#
# compile
#
# on Linux (GNU's GCC)
/usr/local/bin/gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/home/toggtc/.pythonbrew/pythons/Python-2.7.2/include/python2.7 -c /tmp/.../foo.c -o /tmp/.../foo.o
# on Mac (Apple's GCC)
/usr/bin/gcc-4.2 -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Users/toggtc/.pythonbrew/pythons/Python-2.7.2/include/python2.7 -c /var/folders/.../foo.c -o /var/folders/.../foo.o
#
# Link
#
# on Linux (GNU's GCC)
/usr/local/bin/gcc -pthread -shared /tmp/.…/foo.o  -L/home/toggtc/.pythonbrew/pythons/Python-2.7.2 -L -L/home/toggtc/.pythonbrew/pythons/Python-2.7.2/lib -lpython2.7 -o /tmp/.../foo.so
# => foo.so created
# on Mac (Apple's GCC)
/usr/bin/gcc-4.2 -bundle -undefined dynamic_lookup -L/usr/local/lib -L/usr/X11R6/lib /var/folders/.…/foo.o -L`pwd` -L -o /var/folders/..../foo.so
# =>ld: warning: directory not found for option '-L-o'

MacでmanコマンドがNo manual entry for gccを返すときはsudoで

$ man gcc
No manual entry for gcc

こんなときは、

$ sudo man gcc

それでも見つからないときは、環境変数MANPATHが通っているか確認する

$ echo $MANPATH
/usr/local/share/man:/usr/local/man:usr/share/man

もしくは、Mac OS X Developer Libraryで探す
https://developer.apple.com/library/mac/navigation/

Mac OS X 10.7.3 リリース

OS Xの10.7.3がリリースされました。カーネルがDarwin 11.3.0に更新されます。
f:id:toggtc:20120203183827p:plain
Hexley DarwinOS Mascot Copyright 2000 by Jon Hooper. All Rights Reserved.
Darwinのマスコットキャラ、Hexleyくんです。
ライオンという化けの皮をはがすとカモノハシになるんですよ、ええ。

さて、OS X 10.7.2から10.7.3へアップデートした場合、以下のようにカモノハシカーネルとSafariがバージョンアップします。

クラッシュした人が多数居るようなので、しばらく様子を見たほうがいいでしょう。
参考:http://news.mynavi.jp/news/2012/02/03/132/

それでもなお、という方はアップデートしてみてください。
私はアップデートして、ChromeThunderbird、Evernote、MacVim等々を使用しましたが特にクラッシュは発生していません。

10.7.3 アップデートの内容:
http://support.apple.com/kb/DL1485?viewlocale=ja_JP
http://support.apple.com/kb/HT5048?viewlocale=ja_JP

セキュリティアップデートの詳細:
http://support.apple.com/kb/HT1222?viewlocale=ja_JP

個人的にはスリープ復帰後にWiFiに繋がらなくなる問題が解決した点が嬉しい。

事前準備

(1) バックアップ
事前に重要なデータをバックアップしておくなり、Time Machineを使ってバックアップを作成するなりしてください。
(参考)Time Machineの使い方:http://support.apple.com/kb/HT1427?viewlocale=ja_JP
#バックアップなんていらねぇよ、そんなディスクスペースねぇよ、という私のような方はリスク覚悟でそのままアップデートしてください。

(2) 空き領域確保
また、アップデートソフトウェアのサイズが744MB程あるので、ある程度の空き容量を確保しておいてください。
(アップデート完了後に、アップデートソフトウェアは自動で削除されます)

(3) アプリケーション終了
起動中のアプリケーション(ブラウザとか)を終了しておきます。

(4) 電源ケーブルを繋いでおく
MacBookな方は、電源ケーブルを繋いでおきましょう。

アップデート手順

アップデートを開始したら、終了するまで中断しないでください。

(1) 左上のりんごマークを押して、ソフトウェア・アップデートを選択する
f:id:toggtc:20120203071232j:plain

(2) ちょっと待つ
f:id:toggtc:20120203071702p:plain

(3) 「詳細情報を表示」を押す
f:id:toggtc:20120203071720p:plain

(4) Mac OS X アップデートが含まれていることを確認して、「x項目をインストール」を押す
f:id:toggtc:20120203071747p:plain

(5) 同意する
f:id:toggtc:20120203071929p:plain

(6) しばらく待つ
f:id:toggtc:20120203072421p:plain

(7) 再起動する
f:id:toggtc:20120203071944p:plain

(8) 結構待つ
再起動時に、ソフトウェアのアップデートが実行されます。

(9) ログインする
起動したら、いつも通りログインします。

(10) もう一度(1)を実行して、アップデートが無いか確認する
f:id:toggtc:20120203074522p:plain

(11) アップデートされたか確認する
りんごマークを押して、「このMacについて」を選択する
f:id:toggtc:20120203074755j:plain

f:id:toggtc:20120203074934j:plain

10.7.3と表示されればアップデート成功です。

Terminalから`uname -r`と打っても確認できます。