共有ライブラリをPythonプロセスへロードする方法はいくつかあります。 一つの方法は下記のクラスの一つをインスタンス化することです:
name, mode=DEFAULT_MODE, handle=None) |
int
を返すと仮定されます。
name, mode=DEFAULT_MODE, handle=None) |
stdcall
呼び出し規約を使用し、
windows固有のHRESULTコードを返すと仮定されます。
HRESULT値には関数呼び出しが失敗したのか成功したのかを
特定する情報とともに、補足のエラーコードが含まれます。
戻り値が失敗を知らせたならば、WindowsErrorが自動的に
発生します。
name, mode=DEFAULT_MODE, handle=None) |
stdcall
呼び出し規約を使用し、
デフォルトではint
を返すと仮定されます。
Windows CEでは標準呼び出し規約だけが使われます。便宜上、 このプラットホームでは、WinDLLとOleDLLが 標準呼び出し規約を使用します。
これらのライブラリがエクスポートするどの関数でも呼び出す前に Python GIL は解放され、後でまた必要になります。
name, mode=DEFAULT_MODE, handle=None) |
要するに、これはPython C api関数を直接呼び出すのに便利だというだけです。
これらすべてのクラスは少なくとも一つの引数、すなわちロードする共有ライブラリの
パスを渡して呼び出すことでインスタンス化されます。すでにロード済みの
共有ライブラリへのハンドルがあるなら、handle
名前付き引数として
渡すことができます。土台となっているプラットホームのdlopen
または
LoadLibrary関数がプロセスへライブラリをロードするために使われ、
そのライブラリに対するハンドルを得ます。
modeパラメータはライブラリがどうやってロードされたかを特定するために
使うことができます。詳細は、dlopen(3)
マニュアルページを参考にしてください。
Windowsではmodeは無視されます。
これらのクラスのインスタンスには公開メソッドがありません。けれども、 __getattr__と__getitem__は 特別ははたらきをします。その共有ライブラリがエクスポートする関数に 添字を使って属性としてアクセスできるのです。__getattr__と __getitem__のどちらもが結果をキャッシュし、 そのため常に同じオブジェクトを返すことに注意してください。
次に述べる公開属性が利用できます。それらの名前はエクスポートされた関数名に 衝突しないように下線で始まります:
共有ライブラリは(LibraryLoaderクラスのインスタンスである) 前もって作られたオブジェクトの一つを使うことによってロードすることもできます。 それらのLoadLibraryメソッドを呼び出すか、ローダーインスタンスの属性として ライブラリを取り出すかのどちらかによりロードします。
dlltype) |
dlltype
はCDLL、PyDLL、
WinDLLもしくはOleDLL型の一つであるべきです。
__getattr__は特別なはたらきをします: ライブラリローダーインスタンスの 属性として共有ライブラリにアクセスするとそれがロードされるということを可能にします。 結果はキャッシュされます。そのため、繰り返し属性アクセスを行うと いつも同じライブラリが返されます。
name) |
これらの前もって作られたライブラリローダーを利用することができます:
C Python api に直接アクセするために、すぐに使用できる Python共有ライブラリオブジェクトが用意されています:
int
を返すと仮定されますが、もちろん常に正しいとは
限りません。そのため、これらの関数を使うためには
正しいrestype属性を代入しなければなりません。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。