2008年11月11日

64bit版 Windows で 64bit版 Python の常用に挑戦してみた

はてなブックマークに登録

Python は早くから64bit版 Windows に対応した64bitの Python (amd64だけでなくia64も)を 配布してきましたが、一般的に使われる多くの拡張モジュールが64bit版のバイナリパッケージを 配布していないこともあり、ほとんど普及してきませんでした。

私はamd64版 Windowsを自宅で使っているのですが、 Python 2.5 まではやはり32bit版を 利用してきました。しかし、amd64版があるのに32bit版を使うのは、こう、なんというか、 負けた気分になるので、いつかはamd64版を使いたいと思っていました。

最近Windowsをクリーンインストールすることになり、 Python 2.6 を amd64でいれるか、それとも 今まで通りx86で入れるのか考えたのですが、win32 と wxPython という有名な拡張モジュールが amd64版を配布しはじめている事を知り、とうとうamd64版の Pythonを使い始めることにしました。

環境をそろえていく上でいくつか問題もあったので、環境構築手順を記録しておきます。

Pythonのインストール

Pythonの公式サイト から python-2.6.amd64.msi を ダウンロードしてインストールします。 デフォルトでは C:\Python にインストールされるのですが、私の趣味で C:\usr\Python にインストールしました。

インストールが完了したら、 C:\usr\PythonC:\usr\Python\Scripts を環境変数 PATH に設定しておきます。

setuptoolsのインストール

setuptools は ez_setup.py を使ってインストールするのが常套手段なのですが、同梱されているランチャの 実行ファイルが32bitでコンパイルされており、64bitコンソール上で利用するとエラーになって しまいます。 そこで、パッケージをダウンロードして、ランチャを64bitでコンパイルしなおした上でインストール することにします。

まず、amd64のバイナリを作成できる環境を用意します。私は Microsoft Windows SDK v6.1 を利用しました。コマンドプロンプトから、

"C:\Program Files\Microsoft SDKs\Windows\v6.1\Bin\SetEnv.Cmd" /Release

を実行して、clやlinkが使えるようにしておきます。

次に、Python Package Index から、 setuptools の tarballをダウンロードします。

先ほどのコマンドプロンプトでtarballを展開してできたディレクトリに入り、 launcher.c をコンパイルします。Windows SDK v6.1 でコンパイルするときには、 launcher.c に一行includeを追加してやる必要がありました。

 #include "windows.h"
+#include "process.h"

用意ができたら、ランチャをコンパイルします。gui版(実行してもプロンプトが表示されない) とcli版(プロンプトの中で実行される)の二種類を作成します。コンパイルオプションに注意してください。

C:\setuptools-0.6c9>cl /Ox /DGUI=0 /Fesetuptools\\cli.exe /MT launcher.c /link /SUBSYSTEM:CONSOLE /ENTRY:WinMainCRTStartup
Microsoft (R) C/C++ Optimizing Compiler Version 15.00.21022.08 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

launcher.c
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:setuptools\\cli.exe
/SUBSYSTEM:CONSOLE
/ENTRY:WinMainCRTStartup
launcher.obj

C:\setuptools-0.6c9>cl /Ox /DGUI=1 /Fesetuptools\\gui.exe /MT launcher.c /link /SUBSYSTEM:WINDOWS /ENTRY:WinMainCRTStartup
Microsoft (R) C/C++ Optimizing Compiler Version 15.00.21022.08 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

launcher.c
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:setuptools\\gui.exe
/SUBSYSTEM:WINDOWS
/ENTRY:WinMainCRTStartup
launcher.obj

これで、64bit版のランチャがビルドできたので、setuptools をインストールできます。

C:\setuptools-0.6c9>python setup.py install

IPythonのインストール

IPythonは、通常通り easy_install ipython でインストールできます。 ただし、これだけだと pyreadline がインストールされず、ipythonの力が 半減してしまいます。 pyreadline は普通にeasy_installするだけでは インストールに失敗したので、 http://ipython.scipy.org/dist/ から pyreadline-1.5.tar.gz をダウンロードしてきて、

>easy_install pyreadline-1.5.tar.gz

としてインストールしました。これで、ipythonのセットアップは完了です。

Linuxでは、bash等のシェルの代わりにIPythonを使う気にはならないのですが、 WindowsのコマンドプロンプトのシェルはLinux系のシェルよりも機能が少ないので、 単純なファイル操作だけでもIPythonが便利だったりします。

pywin32のインストール

pywin32はPythonからWindows APIを利用するための拡張ライブラリです。 これを使うと、たとえば win32file.CreateHardLink をつかって ハードリンクを作れるようになります。

sourceforge のダウロードページ から、 pywin32-{バージョン}.win-amd64-py2.6.exe をダウンロードして、インストールします。

拡張モジュールのコンパイル環境の設定

拡張モジュールが入ったソースパッケージを easy_install でインストールするには、 コンパイラの設定をしておく必要があります。32bit版では、Linux派に易しいMinGWを 使っていたのですが、amd64のためにWindows SDKを使う方法を紹介しておきます。

本来ならば、

>set DISTUTILS_USE_SDK=1
>"c:\Program Files\Microsoft SDKs\Windows\v6.1\Bin\SetEnv.Cmd" /Release /x64

とすることで、distutilsはコンパイラを自力で見つけようとせずに、環境変数をそのまま 使うようになります。

しかし、Python-2.6のdistutilsにはバグ (issue3741) があって、エラーになってしまいます。 Pythonをインストールしたディレクトリの下の、Lib/distutils/msvc9compiler.py を開いて、 316行目のtypoを修正します。

-        self.__path = []
+        self.__paths = []

これで、上記の方法でWindows SDKのコンパイラを利用できるようになりました。 32bit Windowsで使えるたいていの拡張ライブラリは、この設定をしてからソースパッケージを インストールすることで利用可能になります。


@methane
klab_gijutsu2 at 17:43│Comments(0)TrackBack(0)Python 

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Blog内検索
Archives
このブログについて
DSASとは、KLab が構築し運用しているコンテンツサービス用のLinuxベースのインフラです。現在5ヶ所のデータセンタにて構築し、運用していますが、我々はDSASをより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。
このブログでは、そんな DSAS で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。
最新コメント