36.6。 dl —共有オブジェクトでC関数を呼び出す
dl モジュールは、dlopen()
関数へのインターフェイスを定義します。これは、動的にリンクされたライブラリを処理するためのUnixプラットフォームで最も一般的なインターフェイスです。 これにより、プログラムはそのようなライブラリ内の任意の関数を呼び出すことができます。
ノート
sizeof(int) == sizeof(long) == sizeof(char *)
でない限り、このモジュールは機能しません。そうでない場合、インポート時にSystemError
が発生します。
dl モジュールは、次の関数を定義します。
- dl.open(name[, mode=RTLD_LAZY])
共有オブジェクトファイルを開き、ハンドルを返します。 モードは、遅延バインディング( RTLD_LAZY )または即時バインディング( RTLD_NOW )を示します。 デフォルトは RTLD_LAZY です。 一部のシステムは RTLD_NOW をサポートしていないことに注意してください。
戻り値は
dlobject
です。
dl モジュールは、次の定数を定義します。
- dl.RTLD_LAZY
- open()の引数として役立ちます。
- dl.RTLD_NOW
- open()の引数として役立ちます。 即時バインディングをサポートしないシステムでは、この定数はモジュールに表示されないことに注意してください。 移植性を最大限にするには、 hasattr()を使用して、システムが即時バインディングをサポートしているかどうかを判別します。
dl モジュールは、次の例外を定義します。
- exception dl.error
- 動的ロードおよびリンクルーチン内でエラーが発生した場合に発生する例外。
例:
>>> import dl, time
>>> a=dl.open('/lib/libc.so.6')
>>> a.call('time'), time.time()
(929723914, 929723914.498)
この例はDebianGNU / Linuxシステムで試されたものであり、このモジュールを使用することは通常悪い代替手段であるという事実の良い例です。
36.6.1。 Dlオブジェクト
上記の open()によって返されるDlオブジェクトには、次のメソッドがあります。
- dl.close()
- メモリを除くすべてのリソースを解放します。
- dl.sym(name)
name という名前の関数のポインターを、参照されている共有オブジェクトに存在する場合は数値として返し、存在しない場合は
None
を返します。 これは、次のようなコードで役立ちます。>>> if a.sym('time'): ... a.call('time') ... else: ... time.time()
(ゼロは NULL ポインターであるため、この関数はゼロ以外の数値を返すことに注意してください)
- dl.call(name[, arg1[, arg2...]])
参照されている共有オブジェクトで name という名前の関数を呼び出します。 引数は、そのまま渡されるPython整数、ポインタが渡されるPython文字列、または NULL として渡される
None
のいずれかである必要があります。 Pythonは文字列の変更を好まないため、文字列はconst char*
としてのみ関数に渡される必要があることに注意してください。最大で10個の引数が必要であり、指定されていない引数は
None
として扱われます。 関数の戻り値は、Python整数であるClong
である必要があります。