モジュールのインポート—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/2.7/c-api/import
移動先:案内検索

モジュールのインポート

PyObject *PyImport_ImportModule(const char *name)

これは、以下の PyImport_ImportModuleEx()への簡略化されたインターフェイスであり、 globals および locals 引数は NULL および level [ X169X]を0に設定します。 name 引数にドットが含まれている場合(パッケージのサブモジュールを指定している場合)、 fromlist 引数はリスト['*']に設定され、戻り値は次のようになります。それ以外の場合のように、それを含むトップレベルのパッケージではなく、名前付きモジュール。 (残念ながら、 name が実際にサブモジュールではなくサブパッケージを指定している場合、これには追加の副作用があります。パッケージの__all__変数で指定されたサブモジュールがロードされます。)への新しい参照を返します。インポートされたモジュール、または NULL (失敗時に例外が設定されます)。 Python 2.4より前でも、モジュールは失敗した場合でも作成される可能性があります— sys.modulesを調べて調べてください。 Python 2.4以降、モジュールのインポートに失敗しても、モジュールはsys.modulesのままになりません。

バージョン2.4で変更:インポートに失敗すると、不完全なモジュールオブジェクトが削除されます。

バージョン2.6で変更:常に絶対インポートを使用します。

PyObject *PyImport_ImportModuleNoBlock(const char *name)

このバージョンの PyImport_ImportModule()はブロックしません。 これは、関数を実行するために他のモジュールをインポートするC関数で使用することを目的としています。 別のスレッドがインポートロックを保持している場合、インポートがブロックされることがあります。 関数 PyImport_ImportModuleNoBlock()はブロックしません。 最初にsys.modulesからモジュールをフェッチしようとし、ロックが保持されていない限り PyImport_ImportModule()にフォールバックします。ロックが保持されている場合、関数はImportErrorを発生させます。

バージョン2.6の新機能。

PyObject *PyImport_ImportModuleEx(char *name, PyObject *globals, PyObject *locals, PyObject *fromlist)

モジュールをインポートします。 これは、組み込みのPython関数 __ import __()を参照することで最もよく説明されます。これは、標準の __ import __()関数がこの関数を直接呼び出すためです。

戻り値は、インポートされたモジュールまたはトップレベルパッケージへの新しい参照、または NULL ですが、失敗時に例外が設定されます(Python 2.4より前では、この場合でもモジュールが作成される可能性があります)。 __ import __()と同様に、空でない fromlist が指定されていない限り、パッケージのサブモジュールが要求されたときの戻り値は通常、最上位のパッケージです。

バージョン2.4で変更:インポートに失敗すると、不完全なモジュールオブジェクトが削除されます。

バージョン2.6で変更:この関数は PyImport_ImportModuleLevel()のエイリアスであり、レベルは-1であり、相対インポートを意味します。

PyObject *PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)

モジュールをインポートします。 これは、組み込みのPython関数 __ import __()を参照することで最もよく説明されます。これは、標準の __ import __()関数がこの関数を直接呼び出すためです。

戻り値は、インポートされたモジュールまたは最上位パッケージへの新しい参照、または NULL ですが、失敗時に例外が設定されます。 __ import __()と同様に、空でない fromlist が指定されていない限り、パッケージのサブモジュールが要求されたときの戻り値は通常、最上位のパッケージです。

バージョン2.5の新機能。

PyObject *PyImport_Import(PyObject *name)

これは、現在の「インポートフック関数」を呼び出す高レベルのインターフェイスです。 現在のグローバルの__builtins__から __ import __()関数を呼び出します。 これは、現在の環境にインストールされているインポートフックを使用してインポートが行われることを意味します。 rexec またはihooksによって。

バージョン2.6で変更:常に絶対インポートを使用します。

PyObject *PyImport_ReloadModule(PyObject *m)
モジュールをリロードします。 これは、組み込みのPython関数 reload()を参照することで最もよく説明されます。これは、標準の reload()関数がこの関数を直接呼び出すためです。 再ロードされたモジュールへの新しい参照を返すか、失敗時に例外が設定された NULL を返します(この場合、モジュールはまだ存在します)。
PyObject *PyImport_AddModule(const char *name)

モジュール名に対応するモジュールオブジェクトを返します。 name 引数は、package.moduleの形式にすることができます。 まず、モジュールディクショナリがあるかどうかを確認し、ない場合は、新しいモジュールディクショナリを作成してモジュールディクショナリに挿入します。 失敗時に例外を設定して NULL を返します。

ノート

この関数はモジュールをロードまたはインポートしません。 モジュールがまだロードされていない場合は、空のモジュールオブジェクトを取得します。 PyImport_ImportModule()またはそのバリアントの1つを使用して、モジュールをインポートします。 name の点線の名前で示されるパッケージ構造は、まだ存在しない場合は作成されません。

PyObject *PyImport_ExecCodeModule(char *name, PyObject *co)

モジュール名(おそらくpackage.moduleの形式)とPythonバイトコードファイルから読み取られた、または組み込み関数 compile()から取得されたコードオブジェクトを指定して、モジュールをロードします。 モジュールオブジェクトへの新しい参照を返すか、エラーが発生した場合は例外を設定して NULL を返します。 Python 2.4より前でも、エラーの場合にモジュールが作成される可能性がありました。 Python 2.4以降、エラーの場合、および name がすでに sys.modules にあったとしても、 namesys.modules から削除されます。 PyImport_ExecCodeModule()へのエントリ時。 不完全に初期化されたモジュールを sys.modules に残すことは危険です。そのようなモジュールのインポートでは、モジュールオブジェクトが不明な(そしておそらくモジュール作成者の意図に関して破損している)状態であることを知る方法がないためです。

モジュールの__file__属性は、コードオブジェクトのco_filenameに設定されます。

モジュールがすでにインポートされている場合、この関数はモジュールをリロードします。 モジュールをリロードする目的の方法については、 PyImport_ReloadModule()を参照してください。

namepackage.moduleの形式の点線の名前を指している場合、まだ作成されていないパッケージ構造は作成されません。

バージョン2.4で変更:エラーの場合、 namesys.modules から削除されました。

PyObject *PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
PyImport_ExecCodeModule()と同様ですが、モジュールオブジェクトの__file__属性は、NULL以外の場合、パス名に設定されます。
long PyImport_GetMagicNumber()
Pythonバイトコードファイルのマジックナンバーを返します(別名 .pycおよび.pyoファイル)。 マジックナンバーは、バイトコードファイルの最初の4バイトに、リトルエンディアンのバイト順で存在する必要があります。
PyObject *PyImport_GetModuleDict()
モジュール管理に使用される辞書を返します(別名 sys.modules)。 これはインタプリタごとの変数であることに注意してください。
PyObject *PyImport_GetImporter(PyObject *path)

sys.path / pkg.__path__アイテム path のインポーターオブジェクトを、おそらく sys.path_importer_cache dictからフェッチして返します。 まだキャッシュされていない場合は、パスアイテムを処理できるフックが見つかるまで sys.path_hooks をトラバースします。 フックができない場合はNoneを返します。 これは、組み込みのインポートメカニズムにフォールバックする必要があることを呼び出し元に通知します。 結果を sys.path_importer_cache にキャッシュします。 インポーターオブジェクトへの新しい参照を返します。

バージョン2.6の新機能。

void _PyImport_Init()
インポートメカニズムを初期化します。 内部使用のみ。
void PyImport_Cleanup()
モジュールテーブルを空にします。 内部使用のみ。
void _PyImport_Fini()
インポートメカニズムを完成させます。 内部使用のみ。
PyObject *_PyImport_FindExtension(char*, char*)
内部使用のみ。
PyObject *_PyImport_FixupExtension(char*, char*)
内部使用のみ。
int PyImport_ImportFrozenModule(char *name)
name という名前のフリーズしたモジュールをロードします。 成功した場合は1を返し、モジュールが見つからない場合は0を返し、初期化が失敗した場合は例外を設定して-1を返します。 ロードが成功したときにインポートされたモジュールにアクセスするには、 PyImport_ImportModule()を使用します。 (誤称に注意してください—この関数は、モジュールがすでにインポートされている場合、モジュールを再ロードします。)
struct _frozen

これは、 freeze ユーティリティによって生成されたフリーズモジュール記述子の構造型定義です(PythonソースディストリビューションのTools/freeze/を参照)。 Include/import.hにあるその定義は、次のとおりです。

struct _frozen {
    char *name;
    unsigned char *code;
    int size;
};
struct _frozen *PyImport_FrozenModules
このポインターは、struct _frozenレコードの配列を指すように初期化され、メンバーがすべて NULL またはゼロであるもので終了します。 フリーズされたモジュールがインポートされると、このテーブルで検索されます。 サードパーティのコードはこれを悪用して、動的に作成された凍結モジュールのコレクションを提供する可能性があります。
int PyImport_AppendInittab(const char *name, void (*initfunc)(void))
組み込みモジュールの既存のテーブルに単一のモジュールを追加します。 これは PyImport_ExtendInittab()の便利なラッパーであり、テーブルを拡張できなかった場合は-1を返します。 新しいモジュールは name という名前でインポートでき、最初にインポートを試みたときに呼び出される初期化関数として関数 initfunc を使用します。 これは、 Py_Initialize()の前に呼び出す必要があります。
struct _inittab

組み込みモジュールのリスト内の単一のエントリを記述する構造。 これらの各構造は、インタープリターに組み込まれているモジュールの名前と初期化関数を提供します。 Pythonを組み込むプログラムは、これらの構造体の配列を PyImport_ExtendInittab()と組み合わせて使用して、追加の組み込みモジュールを提供する場合があります。 構造はInclude/import.hで次のように定義されています。

struct _inittab {
    char *name;
    void (*initfunc)(void);
};
int PyImport_ExtendInittab(struct _inittab *newtab)
モジュールのコレクションを組み込みモジュールのテーブルに追加します。 newtab 配列は、nameフィールドの NULL を含むセンチネルエントリで終了する必要があります。 番兵の値を指定しないと、メモリ障害が発生する可能性があります。 成功した場合は0を返し、内部テーブルを拡張するために十分なメモリを割り当てることができなかった場合は-1を返します。 障害が発生した場合、モジュールは内部テーブルに追加されません。 これは、 Py_Initialize()の前に呼び出す必要があります。