Windows での拡張モジュールのビルドには、Unix と同じように、 distutils パッケージを使 ったビルド作業の制御と手動の二通りのアプローチがあります。 distutils によるアプローチはほとんどの拡張モジュールで うまくいきます; distutils を使った拡張モジュールのビルドとパッケージ化については、 Python モジュールの配布 に あります。この節では、C や C++で書かれた Python 拡張モジュール を手動でビルドするアプローチについて述べます。
以下の説明に従って拡張モジュールをビルドするには、インストールされている Python と同じバージョンの Python のソースコードを持っていなければ なりません。また、 Microsoft Visual C++ ``Developer Studio'' が必要になります; プロジェクトファイルは VC++ バージョン 7.1 向けのものが提供されていますが、以前のバージョンの VC++も 使えます。Python自体をビルドしたものと同じバージョンの VC++を使わなけ ればならないことに注意しましょう。 ここで述べる例題のファイルは、Python ソースコードと 共に配布されており、PC\example_nt\ ディレクトリにあります。
ビルド構成を選びます。このステップは省略できます。 ビルド > 設定マネージャー > アクティブなソリューシ ョンの設定 を選び、リリース または デバッグ を選 びます。このステップを飛ばすと、VC++ はデフォルトでデバッグ構成を使い ます。
C>
は DOS コマンドのプロンプト、»>
は
Python のプロンプトです; ビルド情報や様々なデバッグ出力は、
ここに示したスクリーン出力と一致しないこともあるので注意して下さい):
C>..\..\PCbuild\python_d Adding parser accelerators ... Done. Python 2.2 (#28, Dec 19 2001, 23:26:37) [MSC 32 bit (Intel)] on win32 Type "copyright", "credits" or "license" for more information. >>> import example [4897 refs] >>> example.foo() Hello, world [4903 refs] >>>
おめでとうございます! とうとう初めての Python 拡張モジュールのビルド に成功しましたね。
"spam"
にして、Py_InitModule() を
呼び出します (このディレクトリにある、最小限の内容が書かれている
example.c を手がかりにするとよいでしょう)。
ならわしとして、ファイルはspam.c または spammodule.c
という名前にしておきます。
出力ファイル名はリリースモードでは smap.dll や spam.pyd、
デバッグモードではsmap_d.dll や spam_d.pyd、になるはず
です (後者は、システムライブラリ spam.dll と、Python
インタフェースとなる自作のモジュールとの混同を避けるために
推奨されています) 。
さて、やり方は二通りあります:
どちらの場合も、example_nt\example.def を
spam\spam.def にコピーして、新たにできた
spam.def を編集し、二行目に `initspam
' が入るように
します。
自分で新たなプロジェクトを作成したのなら、ここで spam.def を
プロジェクトに追加しておいてください (このファイルはたった二行しか
ない目障りなファイルです。.def ファイルを全く無視するという
方法もあり、それには /exprt:initspam を
「プロジェクトのプロパティ」ダイアログにあるリンク設定のどこかに
手動で追加します)。
TODO
You should now create the file spam.def as instructed in
the previous section. Add the source files to the project, using
Project > Add Existing Item. Set the pattern to
*.*
and select both spam.c and spam.def and
click OK. (Inserting them one by one is fine too.)
プロジェクト > spam のプロパティ ダイアログを開きます。 ほんのいくつかですが、設定の変更が必要です。構成 ドロップダウ ンリストに すべての構成 が設定されているか確かめてください。 C/C++ タブを選び、ポップアップメニューから「一般」カテゴリを選びます。 以下のテキスト:
..\Include,..\PC
を、追加のインクルードディレクトリ とラベルされた エントリボックスに入力します
次に、「リンカ」タブの「一般」カテゴリを選び、
..\PCbuild
を 追加のライブラリディレクトリ と書かれたテキストボックスに 入力します。
さて、構成ごとに特有の設定をいくつか行う必要があります:
「構成」 ドロップダウンリストから、リリース を
選んでください。「リンク」タブをクリックし、「入力」カテゴリを
選んで、「追加の依存ファイル」ボックス内のリストにpythonXY.lib
を追加します。
「構成」 ドロップダウンリストから、デバッグ に切り替え、
「追加の依存ファイル」ボックス内のリストにpythonXY_d.lib
を追加します。
次に C/C++ タブをクリックして、 コード生成 をカテゴリから
選び、 ラインタイムライブラリ に対して
マルチスレッド デバッグ DLL を選びます。
「構成」ドロップダウンリストから リリース に切り替えなおし ます。 ラインタイムライブラリ に対して マルチスレッド DLL を選びます。
前の節で述べたspam.def をここで作成しておかねばなりません。
その後、追加 > ファイルをプロジェクトに追加
ダイアログを選びます。「ファイルの種類」を *.*
にして、
spam.c と spam.def を選び、 OK をクリックします
(一つ一つファイルを追加してもかまいません)。
作っているモジュールが新たな型を作成するのなら、 以下の行:
PyObject_HEAD_INIT(&PyType_Type)
がうまくいかないはずです。そこで:
PyObject_HEAD_INIT(NULL)
に変更してください。また、以下の行をモジュール初期化関数に加えます:
MyObject_Type.ob_type = &PyType_Type;
この操作を行う詳しい理由は、 Python FAQ の 第 3 節を参照してください。
このドキュメントについて... をご覧ください。 ご意見やご指摘をお寄せになりたい方は、