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

バージョン 2.6 で非推奨: `dl` モジュールは Python 3 で削除されました。代わりに `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整数である) です。