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整数である) です。
