36.6. dl —共有オブジェクトでC関数を呼び出す—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/2.7/library/dl
移動先:案内検索

36.6。 dl —共有オブジェクトでC関数を呼び出す

バージョン2.6以降非推奨: dl モジュールはPython3で削除されました。 代わりに ctypes モジュールを使用してください。


dl モジュールは、dlopen()関数へのインターフェイスを定義します。これは、動的にリンクされたライブラリを処理するためのUnixプラットフォームで最も一般的なインターフェイスです。 これにより、プログラムはそのようなライブラリ内の任意の関数を呼び出すことができます。

警告

dl モジュールは、Python型システムとエラー処理をバイパスします。 誤って使用すると、セグメンテーション違反、クラッシュ、またはその他の誤った動作が発生する可能性があります。


ノート

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整数であるC longである必要があります。