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

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

モジュールのインポート

PyObject *PyImport_ImportModule(const char *name)

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

この関数は常に絶対インポートを使用します。

PyObject *PyImport_ImportModuleNoBlock(const char *name)

この関数は、 PyImport_ImportModule()の非推奨のエイリアスです。

バージョン3.3で変更:この関数は、インポートロックが別のスレッドによって保持されているとすぐに失敗していました。 ただし、Python 3.3では、ほとんどの目的でロックスキームがモジュールごとのロックに切り替えられたため、この関数の特別な動作は不要になりました。

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

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

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

インポートに失敗すると、 PyImport_ImportModule()のように、不完全なモジュールオブジェクトが削除されます。

PyObject *PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)

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

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

バージョン3.3の新機能。

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

PyImport_ImportModuleLevelObject()に似ていますが、名前はUnicodeオブジェクトではなくUTF-8でエンコードされた文字列です。

バージョン3.3で変更: level の負の値は受け入れられなくなりました。

PyObject *PyImport_Import(PyObject *name)

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

この関数は常に絶対インポートを使用します。

PyObject *PyImport_ReloadModule(PyObject *m)
モジュールをリロードします。 再ロードされたモジュールへの新しい参照、または失敗時に例外が設定されたNULLを返します(この場合、モジュールはまだ存在します)。
PyObject *PyImport_AddModuleObject(PyObject *name)

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

ノート

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

バージョン3.3の新機能。

PyObject *PyImport_AddModule(const char *name)
PyImport_AddModuleObject()に似ていますが、名前はUnicodeオブジェクトではなくUTF-8でエンコードされた文字列です。
PyObject *PyImport_ExecCodeModule(const char *name, PyObject *co)

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

モジュールの __ spec __ および __ loader __ は、まだ設定されていない場合は、適切な値で設定されます。 スペックのローダーは、モジュールの__loader__(設定されている場合)に設定され、それ以外の場合はSourceFileLoaderのインスタンスに設定されます。

モジュールの __ file __ 属性は、コードオブジェクトのco_filenameに設定されます。 該当する場合は、 __ cached __ も設定されます。

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

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

PyImport_ExecCodeModuleEx()および PyImport_ExecCodeModuleWithPathnames()も参照してください。

PyObject *PyImport_ExecCodeModuleEx(const char *name, PyObject *co, const char *pathname)

PyImport_ExecCodeModule()と同様ですが、モジュールオブジェクトの __ file __ 属性は、NULL以外の場合、パス名に設定されます。

PyImport_ExecCodeModuleWithPathnames()も参照してください。

PyObject *PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, PyObject *cpathname)

PyImport_ExecCodeModuleEx()と同様ですが、モジュールオブジェクトの __ cached __ 属性は、NULL以外の場合、 cpathname に設定されます。 3つの機能のうち、これを使用することをお勧めします。

バージョン3.3の新機能。

PyObject *PyImport_ExecCodeModuleWithPathnames(const char *name, PyObject *co, const char *pathname, const char *cpathname)

PyImport_ExecCodeModuleObject()と同様ですが、 namepathnamecpathname はUTF-8でエンコードされた文字列です。 前者がNULLに設定されている場合、 pathname の値が cpathname からどうあるべきかを理解する試みも行われます。

バージョン3.2の新機能。

バージョン3.3で変更:バイトコードパスのみが指定されている場合、ソースパスの計算に imp.source_from_cache()を使用します。

long PyImport_GetMagicNumber()

Pythonバイトコードファイルのマジックナンバーを返します(別名 .pycファイル)。 マジックナンバーは、バイトコードファイルの最初の4バイトに、リトルエンディアンのバイト順で存在する必要があります。 エラー時に-1を返します。

バージョン3.3で変更:失敗時の-1の戻り値。

const char *PyImport_GetMagicTag()

PEP 3147 形式のPythonバイトコードファイル名のマジックタグ文字列を返します。 sys.implementation.cache_tagの値は信頼できるものであり、この関数の代わりに使用する必要があることに注意してください。

バージョン3.2の新機能。

PyObject *PyImport_GetModuleDict()
モジュール管理に使用される辞書を返します(別名 sys.modules)。 これはインタプリタごとの変数であることに注意してください。
PyObject *PyImport_GetModule(PyObject *name)

指定された名前ですでにインポートされたモジュールを返します。 モジュールがまだインポートされていない場合は、NULLを返しますが、エラーは設定されません。 NULLを返し、ルックアップが失敗した場合はエラーを設定します。

バージョン3.7の新機能。

PyObject *PyImport_GetImporter(PyObject *path)
sys.path / pkg.__path__アイテム path のファインダーオブジェクトを、おそらく sys.path_importer_cache dictからフェッチして返します。 まだキャッシュされていない場合は、パスアイテムを処理できるフックが見つかるまで sys.path_hooks をトラバースします。 フックができない場合はNoneを返します。 これは、パスベースのファインダーがこのパスアイテムのファインダーを見つけることができなかったことを呼び出し元に通知します。 結果を sys.path_importer_cache にキャッシュします。 ファインダーオブジェクトへの新しい参照を返します。
void _PyImport_Init()
インポートメカニズムを初期化します。 内部使用のみ。
void PyImport_Cleanup()
モジュールテーブルを空にします。 内部使用のみ。
void _PyImport_Fini()
インポートメカニズムを完成させます。 内部使用のみ。
int PyImport_ImportFrozenModuleObject(PyObject *name)

name という名前のフリーズしたモジュールをロードします。 成功した場合は1を返し、モジュールが見つからない場合は0を返し、初期化が失敗した場合は例外を設定して-1を返します。 ロードが成功したときにインポートされたモジュールにアクセスするには、 PyImport_ImportModule()を使用します。 (誤称に注意してください—この関数は、モジュールがすでにインポートされている場合、モジュールを再ロードします。)

バージョン3.3の新機能。

バージョン3.4で変更: __file__属性はモジュールに設定されなくなりました。

int PyImport_ImportFrozenModule(const char *name)
PyImport_ImportFrozenModuleObject()に似ていますが、名前はUnicodeオブジェクトではなくUTF-8でエンコードされた文字列です。
struct _frozen

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

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

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

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