31.1. imp —インポート内部にアクセスします—Pythonドキュメント

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

31.1。 インプ —にアクセスします輸入内部

このモジュールは、 import ステートメントを実装するために使用されるメカニズムへのインターフェースを提供します。 次の定数と関数を定義します。

imp.get_magic()
バイトコンパイルされたコードファイル(.pycファイル)の認識に使用されるマジックストリング値を返します。 (この値は、Pythonのバージョンごとに異なる場合があります。)
imp.get_suffixes()
それぞれが特定のタイプのモジュールを記述している3要素タプルのリストを返します。 各トリプルの形式は(suffix, mode, type)です。ここで、サフィックスは、検索するファイル名を形成するためにモジュール名に追加される文字列です。モードは、次のモード文字列です。組み込みの open()関数に渡してファイルを開き(テキストファイルの場合は'r'、バイナリファイルの場合は'rb')、タイプはファイルタイプであり、以下に説明する値 PY_SOURCEPY_COMPILED 、または C_EXTENSION のいずれかを持ちます。
imp.find_module(name[, path])

モジュール name を見つけてください。 path が省略されているかNoneの場合、sys.pathで指定されたディレクトリ名のリストが検索されますが、最初にいくつかの特別な場所が検索されます。 -指定された名前のモジュール( C_BUILTIN )、次にフリーズされたモジュール( PY_FROZEN )、および一部のシステムでは他の場所も調べられます(Windowsでは、特定のファイルを指す可能性のあるレジストリ)。

それ以外の場合、 path はディレクトリ名のリストである必要があります。 各ディレクトリで、上記の get_suffixes()によって返されるサフィックスのいずれかが付いたファイルが検索されます。 リスト内の無効な名前は黙って無視されます(ただし、すべてのリスト項目は文字列である必要があります)。

検索が成功した場合、戻り値は3要素のタプル(file, pathname, description)です。

file は先頭に配置されたオープンファイルオブジェクト、 pathname は見つかったファイルのパス名、 description はに含まれる3要素のタプルです。見つかったモジュールの種類を説明する get_suffixes()によって返されるリスト。

モジュールがファイルに存在しない場合、返されるファイルNoneパス名は空の文字列、説明タプルにはサフィックスとモードの空の文字列。 モジュールタイプは、上記の括弧内に示されているように示されます。 検索に失敗した場合は、ImportErrorが発生します。 その他の例外は、引数または環境に問題があることを示しています。

モジュールがパッケージの場合、ファイルNoneパス名はパッケージパス、説明タプルの最後の項目はです。 ] PKG_DIRECTORY

この関数は、階層モジュール名(ドットを含む名前)を処理しません。 パッケージ PPM 、つまりサブモジュール M を見つけるには、 find_module()および load_module()を使用します。 を使用してパッケージ P を検索してロードし、 path 引数をP.__path__に設定して find_module()を使用します。 P 自体に点線の名前がある場合は、このレシピを再帰的に適用します。

imp.load_module(name, file, pathname, description)

find_module()によって(または互換性のある結果を生成する他の方法で実行された検索によって)以前に検出されたモジュールをロードします。 この関数は、モジュールをインポートするだけではありません。モジュールがすでにインポートされている場合は、 reload()と同等です。 name 引数は、完全なモジュール名を示します(これがパッケージのサブモジュールである場合は、パッケージ名を含みます)。 file 引数は開いているファイルであり、 pathname は対応するファイル名です。 モジュールがパッケージの場合、またはファイルからロードされていない場合、これらはそれぞれNoneおよびになります。 description 引数は、 get_suffixes()によって返されるタプルであり、ロードする必要のあるモジュールの種類を記述します。

ロードが成功した場合、戻り値はモジュールオブジェクトです。 それ以外の場合は、例外(通常はImportError)が発生します。

重要:呼び出し元は、Noneでない場合、例外が発生した場合でも、 file 引数を閉じる責任があります。 これは、 tryfinally ステートメントを使用して行うのが最適です。

imp.new_module(name)
name という新しい空のモジュールオブジェクトを返します。 このオブジェクトは、sys.modules挿入されていません
imp.lock_held()

インポートロックが現在保持されている場合はTrueを返し、そうでない場合はFalseを返します。 スレッドのないプラットフォームでは、常にFalseを返します。

スレッドのあるプラットフォームでは、インポートを実行するスレッドは、インポートが完了するまで内部ロックを保持します。 このロックは、元のインポートが完了するまで他のスレッドがインポートを実行するのをブロックします。これにより、インポートの完了プロセス中に、他のスレッドが元のスレッドによって構築された不完全なモジュールオブジェクトを確認できなくなります(インポートが存在する場合は、それによってトリガーされます)。 )。

imp.acquire_lock()

現在のスレッドのインタープリターのインポートロックを取得します。 このロックは、モジュールをインポートするときにスレッドセーフを確保するためにインポートフックで使用する必要があります。

スレッドがインポートロックを取得すると、同じスレッドがブロックせずに再度インポートロックを取得できます。 スレッドは、取得するたびに1回解放する必要があります。

スレッドのないプラットフォームでは、この関数は何もしません。

バージョン2.3の新機能。

imp.release_lock()

インタプリタのインポートロックを解除します。 スレッドのないプラットフォームでは、この関数は何もしません。

バージョン2.3の新機能。

このモジュールで定義されている整数値の次の定数は、 find_module()の検索結果を示すために使用されます。

imp.PY_SOURCE
モジュールがソースファイルとして見つかりました。
imp.PY_COMPILED
モジュールは、コンパイルされたコードオブジェクトファイルとして見つかりました。
imp.C_EXTENSION
モジュールは動的にロード可能な共有ライブラリとして見つかりました。
imp.PKG_DIRECTORY
モジュールがパッケージディレクトリとして見つかりました。
imp.C_BUILTIN
モジュールは組み込みモジュールとして見つかりました。
imp.PY_FROZEN
モジュールはフリーズされたモジュールとして検出されました( init_frozen()を参照)。

次の定数と関数は廃止されました。 それらの機能は、 find_module()または load_module()から利用できます。 それらは下位互換性のために保持されます:

imp.SEARCH_ERROR
未使用。
imp.init_builtin(name)
name という組み込みモジュールを初期化し、そのモジュールオブジェクトをsys.modulesに格納するとともに返します。 モジュールがすでに初期化されている場合は、再度で初期化されます。 再初期化には、組み込みモジュールの__dict__を、キャッシュされたモジュールからsys.modulesのモジュールのエントリにコピーすることが含まれます。 name という組み込みモジュールがない場合は、Noneが返されます。
imp.init_frozen(name)
name という名前のフリーズされたモジュールを初期化し、そのモジュールオブジェクトを返します。 モジュールがすでに初期化されている場合は、再度で初期化されます。 name というフリーズされたモジュールがない場合は、Noneが返されます。 (フリーズモジュールは、Pythonで記述されたモジュールであり、コンパイルされたバイトコードオブジェクトは、Pythonの freeze ユーティリティによってカスタムビルドのPythonインタープリターに組み込まれます。 今のところTools/freeze/を参照してください。)
imp.is_builtin(name)
name という名前の組み込みモジュールがあり、再度初期化できる場合は、1を返します。 name という名前の組み込みモジュールがあり、再度初期化できない場合は、-1を返します( init_builtin()を参照)。 name という組み込みモジュールがない場合は、0を返します。
imp.is_frozen(name)
name というフリーズされたモジュール( init_frozen()を参照)がある場合はTrueを返し、そのようなモジュールがない場合はFalseを返します。
imp.load_compiled(name, pathname[, file])
バイトコンパイルされたコードファイルとして実装されたモジュールをロードして初期化し、そのモジュールオブジェクトを返します。 モジュールがすでに初期化されている場合は、再度で初期化されます。 name 引数は、モジュールオブジェクトを作成またはアクセスするために使用されます。 pathname 引数は、バイトコンパイルされたコードファイルを指します。 file 引数は、バイトコンパイルされたコードファイルであり、最初からバイナリモードで読み取ることができます。 現在、ファイルをエミュレートするユーザー定義クラスではなく、実際のファイルオブジェクトである必要があります。
imp.load_dynamic(name, pathname[, file])
動的にロード可能な共有ライブラリとして実装されたモジュールをロードして初期化し、そのモジュールオブジェクトを返します。 モジュールがすでに初期化されている場合は、再度で初期化されます。 再初期化には、モジュールのキャッシュされたインスタンスの__dict__属性を、sys.modulesにキャッシュされたモジュールで使用されている値にコピーすることが含まれます。 pathname 引数は、共有ライブラリを指している必要があります。 name 引数は、初期化関数の名前を作成するために使用されます。共有ライブラリ内のinitname()と呼ばれる外部C関数が呼び出されます。 オプションの file 引数は無視されます。 (注:共有ライブラリの使用はシステムに大きく依存し、すべてのシステムがそれをサポートしているわけではありません。)
imp.load_source(name, pathname[, file])
Pythonソースファイルとして実装されたモジュールをロードして初期化し、そのモジュールオブジェクトを返します。 モジュールがすでに初期化されている場合は、再度で初期化されます。 name 引数は、モジュールオブジェクトを作成またはアクセスするために使用されます。 pathname 引数はソースファイルを指します。 file 引数は、最初からテキストとして読み取るために開かれているソースファイルです。 現在、ファイルをエミュレートするユーザー定義クラスではなく、実際のファイルオブジェクトである必要があります。 適切に一致するバイトコンパイル済みファイル(接尾辞.pycまたは.pyo)が存在する場合、指定されたソースファイルを解析する代わりにそれが使用されることに注意してください。
class imp.NullImporter(path_string)

NullImporter タイプは、 PEP 302 インポートフックであり、モジュールが見つからないためにディレクトリ以外のパス文字列を処理します。 既存のディレクトリまたは空の文字列を使用してこのタイプを呼び出すと、ImportErrorが発生します。 それ以外の場合は、 NullImporter インスタンスが返されます。

Pythonは、ディレクトリではなく、sys.path_hooksの他のパスフックによって処理されないパスエントリのsys.path_importer_cacheにこのタイプのインスタンスを追加します。 インスタンスには1つのメソッドしかありません。

find_module(fullname[, path])

このメソッドは常にNoneを返し、要求されたモジュールが見つからなかったことを示します。

バージョン2.5の新機能。

31.1.1。 例

次の関数は、Python 1.4までの標準のインポートステートメント(階層モジュール名なし)をエミュレートします。 ( find_module()が拡張され、 load_module()が1.4で追加されたため、この実装はそのバージョンでは機能しません。)

import imp
import sys

def __import__(name, globals=None, locals=None, fromlist=None):
    # Fast path: see if the module has already been imported.
    try:
        return sys.modules[name]
    except KeyError:
        pass

    # If any of the following calls raises an exception,
    # there's a problem we can't handle -- let the caller handle it.

    fp, pathname, description = imp.find_module(name)

    try:
        return imp.load_module(name, fp, pathname, description)
    finally:
        # Since we may exit via an exception, close fp explicitly.
        if fp:
            fp.close()

階層モジュール名を実装し、 reload()関数を含むより完全な例は、モジュールkneeにあります。 kneeモジュールは、PythonソースディストリビューションのDemo/imputil/にあります。