モジュールのインポート¶
-
PyObject *PyImport_ImportModule(const char *name)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
PyImport_Import()のラッパーで、引数として PyObject* の代わりに const char* を受け取ります。
-
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)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI (バージョン 3.7 より).
モジュールをインポートします。モジュールのインポートについては組み込みの Python 関数
__import__()を読むとよく分かります。というのも、標準の__import__()はこの関数を直接呼び出しているからです。戻り値は、インポートされたモジュールかトップレベルパッケージへの新しい参照か、失敗した場合は例外を設定して
NULLを返します。__import__()と同じように、パッケージのサブモジュールが要求されたときは、空でない fromlist を渡された時以外は、トップレベルのパッケージを返します。Added in version 3.3.
-
PyObject *PyImport_ImportModuleLevel(const char *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
PyImport_ImportModuleLevelObject()と似ていますが、name が Unicode オブジェクトではなく UTF-8 でエンコードされた文字列である点で異なります。バージョン 3.3 で変更: level にはもはや負の値は使用できません。
-
PyObject *PyImport_Import(PyObject *name)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
現在の「インポートフック関数」を呼び出す高水準のインターフェースです (
levelは明示的に 0、つまり絶対インポートに設定されます)。 現在のグローバル名前空間の__builtins__から__import__()関数を呼び出します。 したがって、現在の環境にインストールされたインポートフックを使ってインポートします。この関数は常に絶対インポートを使用します。
-
PyObject *PyImport_ReloadModule(PyObject *m)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
モジュールを再読み込みします。 再読み込みしたモジュールへの新しい参照を返します。 失敗した場合は例外を設定して
NULLを返します (この場合もモジュールは存在します)。
-
PyObject *PyImport_AddModuleRef(const char *name)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI (バージョン 3.13 より).
モジュール名に対応するモジュールオブジェクトを返します。
name引数はpackage.moduleという形式でも構いません。 まずモジュール辞書内を確認し、該当するモジュールがなければ新しく作成してモジュール辞書に挿入します。成功した場合はモジュールへの 強参照 を返します。 失敗した場合は例外を設定して
NULLを返します。モジュール名
nameは UTF-8 からデコードされます。この関数はモジュールを読み込んだりインポートしたりしません。 モジュールがまだ読み込まれていない場合は、空のモジュールオブジェクトが返されます。 モジュールをインポートするには
PyImport_ImportModule()またはその変種を使ってください。nameがドットで区切られた名前であっても、まだ存在しないパッケージ構造は作成されません。Added in version 3.13.
-
PyObject *PyImport_AddModuleObject(PyObject *name)¶
- 戻り値: 借用参照。 次に属します: Stable ABI (バージョン 3.7 より).
PyImport_AddModuleRef()と同様ですが、借用参照 を返し、nameは Python のstrオブジェクトです。Added in version 3.3.
-
PyObject *PyImport_AddModule(const char *name)¶
- 戻り値: 借用参照。 次に属します: Stable ABI.
PyImport_AddModuleRef()と同様ですが、借用参照 を返します。
-
PyObject *PyImport_ExecCodeModule(const char *name, PyObject *co)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
モジュール名 (
package.module形式でも可) と、Python バイトコードファイルから読み込んだか組み込み関数compile()で取得したコードオブジェクトを使って、モジュールを読み込みます。 モジュールオブジェクトへの新しい参照を返し、エラーの場合は例外を設定してNULLを返します。 エラーの場合、PyImport_ExecCodeModule()の呼び出し時にnameがすでにsys.modulesに存在していたとしても、sys.modulesからnameを削除します。 不完全に初期化されたモジュールをsys.modulesに残すのは危険です。 そのモジュールをインポートする側には、モジュールオブジェクトが不明な状態 (おそらく作者の意図からすれば壊れた状態) にあると知る手段がないためです。モジュールの
__spec__と__loader__がまだ設定されていなければ、適切な値を設定します。 spec のローダーには、モジュールの__loader__が設定されていればそれを使い、そうでなければSourceFileLoaderのインスタンスを設定します。モジュールの
__file__属性には、コードオブジェクトのco_filenameを設定します。この関数は、すでにインポートされているモジュールの場合には再ロードを行います。意図的にモジュールの再ロードを行う方法は
PyImport_ReloadModule()を参照してください。name が
package.module形式のドット名表記であった場合、まだ作成されていないパッケージ構造はその作成されないままになります。PyImport_ExecCodeModuleEx()とPyImport_ExecCodeModuleWithPathnames()も参照してください。バージョン 3.12 で変更:
__cached__と__loader__の設定は非推奨になりました。 代替についてはModuleSpecを参照してください。バージョン 3.15 で変更:
__cached__属性を設定しなくなりました。
-
PyObject *PyImport_ExecCodeModuleEx(const char *name, PyObject *co, const char *pathname)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
PyImport_ExecCodeModule()と同様ですが、pathnameがNULLでなければモジュールオブジェクトの__file__属性をその値に設定します。PyImport_ExecCodeModuleWithPathnames()も参照してください。
-
PyObject *PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, PyObject *cpathname)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI (バージョン 3.7 より).
PyImport_ExecCodeModuleEx()と同様ですが、cpathnameがNULLでなければ、そこで指定されたコンパイル済みファイルのパスを適切に使います。 三つの関数の中では、この関数の使用を推奨します。Added in version 3.3.
バージョン 3.12 で変更:
__cached__の設定は非推奨になりました。 代替についてはModuleSpecを参照してください。バージョン 3.15 で変更:
__cached__属性を設定しなくなりました。
-
PyObject *PyImport_ExecCodeModuleWithPathnames(const char *name, PyObject *co, const char *pathname, const char *cpathname)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
PyImport_ExecCodeModuleObject()と似ていますが、 name と pathname、 cpathname が UTF-8 でエンコードされた文字列である点が異なります。もし pathname がNULLの場合、cpathname から、pathname どのような値になるべきかを知る試みもなされます。Added in version 3.2.
バージョン 3.3 で変更: バイトコードのパスだけが指定された場合、ソースのパスの計算に
imp.source_from_cache()を使います。バージョン 3.12 で変更: 削除された
impモジュールを使わなくなりました。
-
long PyImport_GetMagicNumber()¶
- 次に属します: Stable ABI.
Python バイトコードファイル (別名
.pycファイル) のマジックナンバーを返します。マジックナンバーはバイトコードファイルの最初の4バイトに、リトルエンディアンバイトオーダーで現れるべきです。エラーの場合は-1を返します。バージョン 3.3 で変更: 失敗した場合は
-1の値を返します。
-
const char *PyImport_GetMagicTag()¶
- 次に属します: Stable ABI.
マジックタグ文字列を Python バイトコードファイル名の PEP 3147 フォーマットで返します。
sys.implementation.cache_tagの値が信頼でき、かつこの関数の代わりに使用すべきであることを肝に命じましょう。Added in version 3.2.
-
PyObject *PyImport_GetModuleDict()¶
- 戻り値: 借用参照。 次に属します: Stable ABI.
モジュール管理のための辞書 (いわゆる
sys.modules)を返します。この辞書はインタプリタごとに一つだけある変数なので注意してください。
-
PyObject *PyImport_GetModule(PyObject *name)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI (バージョン 3.8 より).
与えられた名前の既にインポート済みのモジュールを返します。 モジュールがインポートされていなかった場合は、
NULLを返しますが、エラーはセットしません。 モジュールの検索に失敗した場合は、NULLを返し、エラーをセットします。Added in version 3.7.
-
PyObject *PyImport_GetImporter(PyObject *path)¶
- 戻り値: 新しい参照。 次に属します: Stable ABI.
sys.pathまたはpkg.__path__の要素pathに対応するファインダーオブジェクトを返します。sys.path_importer_cache辞書から取得する場合もあります。 まだキャッシュされていなければ、そのパス要素を扱えるフックが見つかるまでsys.path_hooksを順に調べます。 どのフックも扱えない場合はNoneを返し、パスベースのファインダー がこのパス要素のファインダーを見つけられなかったことを呼び出し側に伝えます。 結果はsys.path_importer_cacheにキャッシュします。 ファインダーオブジェクトへの新しい参照を返します。
-
int PyImport_ImportFrozenModuleObject(PyObject *name)¶
- 次に属します: Stable ABI (バージョン 3.7 より).
name という名前のフリーズ (freeze) されたモジュールをロードします。成功すると
1を、モジュールが見つからなかった場合には0を、初期化が失敗した場合には例外をセットして-1を返します。ロードに成功したモジュールにアクセスするにはPyImport_ImportModule()を使ってください。 (Note この関数はいささか誤解を招く名前です --- この関数はモジュールがすでにインポートされていたらリロードしてしまいます。)Added in version 3.3.
バージョン 3.4 で変更:
__file__属性はもうモジュールにセットされません。
-
int PyImport_ImportFrozenModule(const char *name)¶
- 次に属します: Stable ABI.
PyImport_ImportFrozenModuleObject()と同様ですが、名前は Unicode オブジェクトではなく UTF-8 エンコードの文字列です。
-
struct _frozen¶
freeze ユーティリティ (Python ソース配布物の
Tools/freeze/を参照) が生成する、フリーズされたモジュールの記述子の構造体型です。Include/import.hにある定義は次のとおりです。struct _frozen { const char *name; /* ASCII エンコードの文字列 */ const unsigned char *code; int size; int is_package; };
バージョン 3.11 で変更: 新しい
is_packageフィールドは、モジュールがパッケージかどうかを示します。sizeフィールドを負の値に設定する方法に代わるものです。
-
const struct _frozen *PyImport_FrozenModules¶
このポインタは
_frozenのレコードからなり、終端の要素のメンバがNULLかゼロになっているような配列を指すよう初期化されます。 フリーズされたモジュールをインポートするとき、このテーブルを検索します。 サードパーティ製のコードからこのポインタに仕掛けを講じて、動的に生成されたフリーズ化モジュールの集合を提供するようにできます。
-
int PyImport_AppendInittab(const char *name, PyObject *(*initfunc)(void))¶
- 次に属します: Stable ABI.
既存の組み込みモジュールテーブルに単一のモジュールを追加します。この関数は利便性を目的とした
PyImport_ExtendInittab()のラッパー関数で、テーブルが拡張できないときには-1を返します。新たなモジュールは name でインポートでき、最初にインポートを試みた際に呼び出される関数として initfunc を使います。Py_Initialize()よりも前に呼び出さなければなりません。
-
struct _inittab¶
組み込みモジュールの一覧の一つのエントリーを記述する構造体です。 Python を組み込むプログラムは、この構造体の配列を
PyImport_ExtendInittab()と併用して、追加の組み込みモジュールを提供できます。 構造体は二つのメンバからなります。-
const char *name¶
ASCII エンコードの文字列で表したモジュール名。
-
const char *name¶
-
int PyImport_ExtendInittab(struct _inittab *newtab)¶
組み込みモジュールのテーブルに、複数のモジュールを追加します。
newtab配列は、nameフィールドがNULLの番兵エントリーで終わる必要があります。 番兵がないとメモリアクセス違反を引き起こす可能性があります。 成功した場合は0を返し、内部テーブルを拡張するためのメモリを十分に割り当てられなければ-1を返します。 失敗した場合、内部テーブルにモジュールは一つも追加されません。Py_Initialize()より前に呼び出す必要があります。Python が複数回初期化される場合、
PyImport_AppendInittab()またはPyImport_ExtendInittab()は、それぞれの初期化の前に呼び出される必要があります。
-
struct _inittab *PyImport_Inittab¶
Python の初期化で使う組み込みモジュールのテーブルです。 直接使わず、代わりに
PyImport_AppendInittab()とPyImport_ExtendInittab()を使ってください。
-
PyObject *PyImport_ImportModuleAttr(PyObject *mod_name, PyObject *attr_name)¶
- 戻り値: 新しい参照。
モジュール
mod_nameをインポートし、その属性attr_nameを取得します。名前は Python の
strオブジェクトでなければなりません。PyImport_Import()とPyObject_GetAttr()を組み合わせた補助関数です。 例えば、モジュールが見つからなければImportError、属性が存在しなければAttributeErrorを送出することがあります。Added in version 3.14.
-
PyObject *PyImport_ImportModuleAttrString(const char *mod_name, const char *attr_name)¶
- 戻り値: 新しい参照。
PyImport_ImportModuleAttr()と同様ですが、名前は Python のstrオブジェクトではなく UTF-8 エンコードの文字列です。Added in version 3.14.
-
PyImport_LazyImportsMode PyImport_GetLazyImportsMode()¶
現在の遅延インポートモードを取得します。
Added in version 3.15.
-
PyObject *PyImport_GetLazyImportsFilter()¶
現在の遅延インポートフィルタへの 強参照 を返します。 フィルタがなければ
NULLを返します。 この関数は常に成功します。Added in version 3.15.
-
int PyImport_SetLazyImportsMode(PyImport_LazyImportsMode mode)¶
現在の遅延インポートモードを設定します。
この関数は常に
0を返します。Added in version 3.15.
-
int PyImport_SetLazyImportsFilter(PyObject *filter)¶
現在の遅延インポートフィルタを設定します。
filterには、インポートを遅延できる可能性があるときに(importing_module_name, imported_module_name, [fromlist])を受け取る呼び出し可能オブジェクトを指定してください。imported_module_nameは解決済みのモジュール名なので、lazy from .spam import eggsの場合はpackage.spamが渡されます。 この呼び出し可能オブジェクトは、インポートを遅延すべきならTrue、そうでなければFalseを返す必要があります。成功した場合は
0を返し、それ以外の場合は例外を設定して-1を返します。Added in version 3.15.
-
type PyImport_LazyImportsMode¶
遅延インポートモードの列挙型。
-
enumerator PyImport_LAZY_NORMAL¶
ソースコード内の
lazyキーワードに従います。 デフォルトのモードです。
-
enumerator PyImport_LAZY_ALL¶
デフォルトですべてのインポートを遅延させます。
Added in version 3.15.
-
enumerator PyImport_LAZY_NORMAL¶
-
PyObject *PyImport_CreateModuleFromInitfunc(PyObject *spec, PyObject *(*initfunc)(void))¶
この関数は、Python を組み込む側が、静的拡張 (例えば静的リンクされた拡張) 用のカスタムインポータの
create_module()ステップを実装するための構成要素です。specはModuleSpecオブジェクトでなければなりません。initfuncは、PyImport_AppendInittab()と同じく 初期化関数 でなければなりません。成功した場合は、モジュールオブジェクトを作成して返します。 このモジュールはまだ初期化されていないので、
PyModule_Exec()を呼び出して初期化してください。 (カスタムインポータではexec_module()メソッド内で行ってください。)エラーの場合は例外を設定して NULL を返します。
従来の単相初期化 を使うモジュールでは、通常インポータが
create_module()の後で行う追加のステップではなく、この関数内でインポート処理の大半を行います。 具体的には次のとおりです。初期化の一環として、モジュールを
specのnameの名前でsys.modulesに追加します。同じ
nameの単相モジュールが、この関数または組み込みモジュールとして (例えばPyImport_AppendInittab()で登録して) 以前にインポートされていた場合、Python はinitfuncを再び呼ぶ代わりに、以前のモジュールの内容を再利用することがあります。モジュールは
initfuncによって完全に初期化されます。PyModule_Exec()を呼び出しても効果はありませんが、モジュールが将来 多相初期化 に移行した場合に備えて、呼び出すことを推奨します。また、
specのnameにドットが含まれる場合、この名前を使って新しいモジュールの__name__に親パッケージの名前を前置します。
Added in version 3.15.