Apple によるロケール周りの変更点を Python 2.5.1 にも適用する
Python: Mac OS X での locale.getpreferredencoding() では、Mac OS X に Python 2.5.1 をソースコードからインストールした場合に発生する、ロケール周りの問題点について書いた。
要約すると、
locale.getpreferredencoding()の返すエンコーディングがX-MAC-JAPANESEになってしまう- Python では
X-MAC-JAPANESEがデフォルトではサポートされていないため、locale.getpreferredencoding()を利用したエンコード、デコードができない - _localmodule.c を変更して、
X-MAC-JAPANESEの代わりにshift_jisを返すようにして解決
という内容だった。
しかし、しばらくして「っき」さんよりコメントをいただいた。
上記のlocale.getpreferredencoding()の返り値ですが、10.4.9に含まれているOS標準のPython 2.3.5では、デフォルトがUS-ASCIIになっていて、LANG環境変数も見てくれます。
これは、Appleがパッケージングの際に、
http://www.opensource.apple.com/darwinsource/10.4.9.x86/python-16.1.3/
以下に含まれているパッチを適用して、ロケール周りのdefined(APPLE)や ‘darwin’ を無効にしているからです。
たしかに、前回の記事では Mac OS X に標準でバンドルされている Python にまで考えが及んでいなかった。「っき」さんの指摘通り、互換性のことも考慮すると、Apple のパッケージングを見習うのがよさそうだ。
というわけで、Apple のパッチを適用した Python 2.5.1 のパッチファイルをアップしておく。以降は、このパッチファイルを作成するまでの詳細である。
Mac OS X に標準でパッケージングされている Python
Apple Developer Connection の Open Source ページでは Mac OS X のベースとなっている Darwin のソースコードが公開されている。現時点での最新版は Mac OS X 10.4.9 のものなので、今回のパッチはこれを基にした。
上記ページからダウンロードできる python-16.1.3.tar.gz には Mac OS X にバンドルされている Python に適用されたパッチが含まれているので、このうち、ロケール周りに関係あるものを Python 2.5.1 のソースコードに適用すればよさそうだ。
Apple のパッチを Python 2.5.1 に適用する
まずは、Python 2.5.1 のソースコードと Apple のパッチ (python-16.1.3.tar.gz) を同じディレクトリにダウンロードして展開する。
% curl -LO http://www.python.org/ftp/python/2.5.1/Python-2.5.1.tgz
% curl -LO http://www.opensource.apple.com/darwinsource/tarballs/other/python-16.1.3.tar.gz
% tar xvzf Python-2.5.1.tgz
% tar xvzf python-16.1.3.tar.gz
以下のようなシェルスクリプトでパッチを適用した。
PROJECT=Python-2.5.1
FIX=python-16.1.3/fix
echo ed - ${PROJECT}/Lib/locale.py \< ${FIX}/locale.py.ed && \
ed - ${PROJECT}/Lib/locale.py < ${FIX}/locale.py.ed && \
echo ed - ${PROJECT}/Modules/_localemodule.c \< ${FIX}/_localemodule.c.ed && \
ed - ${PROJECT}/Modules/_localemodule.c < ${FIX}/_localemodule.c.ed
要するに、
python-16.1.3/fix/locale.py.edpython-16.1.3/fix/_localemodule.c.ed
というふたつのパッチファイルを適用したわけだ。
その diff をとったものが上記のパッチファイルとなる。