14.14.2.2 共有ライブラリをロードする

共有ライブラリをPythonプロセスへロードする方法はいくつかあります。 一つの方法は下記のクラスの一つをインスタンス化することです:

クラス CDLL( name, mode=DEFAULT_MODE, handle=None)
このクラスのインスタンスはロードされた共有ライブラリをあらわします。 これらのライブラリの関数は標準 C 呼び出し規約を使用し、 intを返すと仮定されます。

クラス OleDLL( name, mode=DEFAULT_MODE, handle=None)
Windows用: このクラスのインスタンスはロードされた共有ライブラリを あらわします。これらのライブラリの関数はstdcall呼び出し規約を使用し、 windows固有のHRESULTコードを返すと仮定されます。 HRESULT値には関数呼び出しが失敗したのか成功したのかを 特定する情報とともに、補足のエラーコードが含まれます。 戻り値が失敗を知らせたならば、WindowsErrorが自動的に 発生します。

クラス WinDLL( name, mode=DEFAULT_MODE, handle=None)
Windows用: このクラスのインスタンスはロードされた共有ライブラリを あらわします。これらのライブラリの関数はstdcall呼び出し規約を使用し、 デフォルトではintを返すと仮定されます。

Windows CEでは標準呼び出し規約だけが使われます。便宜上、 このプラットホームでは、WinDLLOleDLLが 標準呼び出し規約を使用します。

これらのライブラリがエクスポートするどの関数でも呼び出す前に Python GIL は解放され、後でまた必要になります。

クラス PyDLL( name, mode=DEFAULT_MODE, handle=None)
Python GILが関数呼び出しの間解放されず、関数実行の後にPython エラーフラグが チェックされるということを除けば、このクラスのインスタンスは CDLLインスタンスのように振る舞います。エラーフラグがセットされた場合、 Python 例外が発生します。

要するに、これはPython C api関数を直接呼び出すのに便利だというだけです。

これらすべてのクラスは少なくとも一つの引数、すなわちロードする共有ライブラリの パスを渡して呼び出すことでインスタンス化されます。すでにロード済みの 共有ライブラリへのハンドルがあるなら、handle名前付き引数として 渡すことができます。土台となっているプラットホームのdlopenまたは LoadLibrary関数がプロセスへライブラリをロードするために使われ、 そのライブラリに対するハンドルを得ます。

modeパラメータはライブラリがどうやってロードされたかを特定するために 使うことができます。詳細は、dlopen(3)マニュアルページを参考にしてください。 Windowsではmodeは無視されます。

RTLD_GLOBAL
modeパラメータとして使うフラグ。このフラグが利用できないプラットホームでは、 整数のゼロと定義されています。

RTLD_LOCAL
modeパラメータとして使うフラグ。これが利用できないプラットホームでは、 RTLD_GLOBALと同様です。

DEFAULT_MODE
共有ライブラリをロードするために使われるデフォルトモード。 OSX 10.3ではRTLD_GLOBALであり、そうでなければ RTLD_LOCALと同じです。

これらのクラスのインスタンスには公開メソッドがありません。けれども、 __getattr____getitem__は 特別ははたらきをします。その共有ライブラリがエクスポートする関数に 添字を使って属性としてアクセスできるのです。__getattr____getitem__のどちらもが結果をキャッシュし、 そのため常に同じオブジェクトを返すことに注意してください。

次に述べる公開属性が利用できます。それらの名前はエクスポートされた関数名に 衝突しないように下線で始まります:

_handle
ライブラリへのアクセスに用いられるシステムハンドル。

_name
コンストラクタに渡されたライブラリの名前。

共有ライブラリは(LibraryLoaderクラスのインスタンスである) 前もって作られたオブジェクトの一つを使うことによってロードすることもできます。 それらのLoadLibraryメソッドを呼び出すか、ローダーインスタンスの属性として ライブラリを取り出すかのどちらかによりロードします。

クラス LibraryLoader( dlltype)
共有ライブラリをロードするクラス。dlltypeCDLLPyDLLWinDLLもしくはOleDLL型の一つであるべきです。

__getattr__は特別なはたらきをします: ライブラリローダーインスタンスの 属性として共有ライブラリにアクセスするとそれがロードされるということを可能にします。 結果はキャッシュされます。そのため、繰り返し属性アクセスを行うと いつも同じライブラリが返されます。

LoadLibrary( name)
共有ライブラリをプロセスへロードし、それを返します。 このメソッドはライブラリの新しいインスタンスを常に返します。

これらの前もって作られたライブラリローダーを利用することができます:

cdll
CDLLインスタンスを作ります。

windll
Windows用: WinDLLインスタンスを作ります。

oledll
Windows用: OleDLLインスタンスを作ります。

pydll
PyDLLインスタンスを作ります。

C Python api に直接アクセするために、すぐに使用できる Python共有ライブラリオブジェクトが用意されています:

pythonapi
属性としてPython C api関数を公開するPyDLLのインスタンス。 これらすべての関数はC intを返すと仮定されますが、もちろん常に正しいとは 限りません。そのため、これらの関数を使うためには 正しいrestype属性を代入しなければなりません。

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。