目次

前のトピックへ

36.5. crypt — Unix パスワードをチェックするための関数

次のトピックへ

36.7. termios — POSIX スタイルの端末制御

このページ

36.6. dl — 共有オブジェクトのC関数の呼び出し

プラットフォーム: Unix

バージョン 2.6 で撤廃: dl モジュールは Python 3.0 で削除されました。代わりに ctypes モジュールを使ってください。

dl モジュールは dlopen() 関数へのインタフェースを定義します。 これはダイナミックライブラリにハンドルするための Unix プラットフォーム上の最も一般的なインタフェースです。 そのライブラリの任意の関数を呼ぶプログラムを与えます。

警告

dl モジュールは Python の型システムとエラー処理をバイパスしています。 もし間違って使用すれば、セグメンテーションフォルト、 クラッシュ、その他の不正な動作を起こします。

ノート

このモジュールは sizeof(int) == sizeof(long) == sizeof(char *) でなければ働きません。 そうでなければimportするときに 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)

この例はDebian GNU/Linuxシステム上で行なったもので、 このモジュールの使用はたいてい悪い選択肢であるという事実のよい例です。

36.6.1. Dlオブジェクト

open() によって返されたDlオブジェクトは次のメソッドを持っています:

dl.close()

メモリーを除く全てのリソースを解放します。

dl.sym(name)

name という名前の関数が参照された共有オブジェクトに存在する場合、 そのポインター(整数値)を返します。存在しない場合 None を返します。 これは次のように使えます:

>>> if a.sym('time'):
...     a.call('time')
... else:
...     time.time()

(0は NULL ポインターであるので、この関数は0でない数を返すだろうということに注意してください)

dl.call(name[, arg1[, arg2...]])

参照された共有オブジェクトの name という名前の関数を呼出します。 引数は、Python整数(そのまま渡される)、Python文字列(ポインターが渡される)、 None (NULL として渡される) のどれかでなければいけません。 Pythonはその文字列が変化させられるのを好まないので、 文字列は const char* として関数に渡されるべきであることに注意してください。

最大で10個の引数が渡すことができ、与えられない引数は None として扱われます。 関数の返り値は C long (Python整数である)です。