31.5。 importlib —の実装輸入
バージョン3.1の新機能。
ソースコード: :source: `Lib / importlib / __ init __。py`
31.5.1。 序章
importlib パッケージの目的は2つあります。 1つは、Pythonソースコードで import ステートメント(したがって、拡張により、 __ import __()関数)の実装を提供することです。 これにより、Pythonインタープリターに移植可能な import の実装が提供されます。 これにより、Python以外のプログラミング言語で実装されたものよりも理解しやすい実装も提供されます。
2つ目は、 import を実装するコンポーネントがこのパッケージで公開されているため、ユーザーは独自のカスタムオブジェクト(総称して importer )を作成してインポートプロセスに参加できます。
も参照してください
- インポートステートメント
- import ステートメントの言語リファレンス。
- パッケージ仕様
- パッケージのオリジナル仕様。 このドキュメントの作成以降、一部のセマンティクスが変更されました(例: sys.modules の
None
に基づいてリダイレクトします。 - __ import __()関数
- import ステートメントは、この関数のシンタックスシュガーです。
- PEP 235
- 大文字と小文字を区別しないプラットフォームへのインポート
- PEP 263
- Pythonソースコードエンコーディングの定義
- PEP 302
- 新しいインポートフック
- PEP 328
- 輸入:マルチラインおよび絶対/相対
- PEP 366
- メインモジュールの明示的な相対インポート
- PEP 420
- 暗黙の名前空間パッケージ
- PEP 451
- インポートシステムのModuleSpecタイプ
- PEP 488
- PYOファイルの削除
- PEP 489
- マルチフェーズ拡張モジュールの初期化
- PEP 3120
- デフォルトのソースエンコーディングとしてUTF-8を使用する
- PEP 3147
- PYCリポジトリディレクトリ
31.5.2。 関数
- importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0)
組み込みの __ import __()関数の実装。
ノート
モジュールのプログラムによるインポートでは、この関数の代わりに import_module()を使用する必要があります。
- importlib.import_module(name, package=None)
モジュールをインポートします。 name 引数は、絶対的または相対的な用語でインポートするモジュールを指定します(例:
pkg.mod
または..mod
のいずれか)。 名前が相対的な用語で指定されている場合、 package 引数は、パッケージ名を解決するためのアンカーとして機能するパッケージの名前に設定する必要があります(例:import_module('..mod', 'pkg.subpkg')
はpkg.mod
をインポートします)。import_module()関数は、 importlib .__ import __()の単純化ラッパーとして機能します。 これは、関数のすべてのセマンティクスが importlib .__ import __()から派生していることを意味します。 これら2つの関数の最も重要な違いは、 import_module()が指定されたパッケージまたはモジュールを返すことです(例:
pkg.mod
)、 __ import __()は最上位のパッケージまたはモジュールを返します(例:pkg
)。インタプリタの実行開始以降に作成されたモジュールを動的にインポートする場合(たとえば、Pythonソースファイルを作成する場合)、新しいモジュールがインポートシステム。
バージョン3.3で変更:親パッケージは自動的にインポートされます。
- importlib.find_loader(name, path=None)
オプションで指定されたパス内で、モジュールのローダーを見つけます。 モジュールが sys.modules にある場合、
sys.modules[name].__loader__
が返されます(ローダーがNone
になるか、設定されていない場合は、 ValueError ]が発生します)。 それ以外の場合は、 sys.meta_path を使用した検索が実行されます。 ローダーが見つからない場合は、None
が返されます。点線の名前には、親をロードする必要があり、望ましくない場合があるため、親が暗黙的にインポートされません。 サブモジュールを正しくインポートするには、サブモジュールのすべての親パッケージをインポートし、 path への正しい引数を使用する必要があります。
バージョン3.3の新機能。
バージョン3.4で変更:
__loader__
が設定されていない場合は、属性がNone
に設定されている場合と同様に、 ValueError を発生させます。バージョン3.4以降非推奨:代わりに importlib.util.find_spec()を使用してください。
- importlib.invalidate_caches()
sys.meta_path に保存されているファインダーの内部キャッシュを無効にします。 ファインダーが
invalidate_caches()
を実装している場合、無効化を実行するために呼び出されます。 この関数は、プログラムの実行中にモジュールが作成/インストールされた場合に呼び出す必要があり、すべてのファインダーが新しいモジュールの存在に気付くことを保証します。バージョン3.3の新機能。
- importlib.reload(module)
以前にインポートしたモジュールをリロードします。 引数はモジュールオブジェクトである必要があるため、以前に正常にインポートされている必要があります。 これは、外部エディターを使用してモジュールのソースファイルを編集し、Pythonインタープリターを離れずに新しいバージョンを試してみたい場合に便利です。 戻り値はモジュールオブジェクトです(再インポートによって別のオブジェクトが sys.modules に配置される場合は異なる可能性があります)。
reload()を実行すると、次のようになります。
Pythonモジュールのコードが再コンパイルされ、モジュールレベルのコードが再実行され、モジュールを最初にロードしたローダーを再利用して、モジュールのディクショナリ内の名前にバインドされる新しいオブジェクトのセットが定義されます。 拡張モジュールの
init
関数は、2回目は呼び出されません。Pythonの他のすべてのオブジェクトと同様に、古いオブジェクトは、参照カウントがゼロに低下した後にのみ再利用されます。
モジュール名前空間の名前は、新しいオブジェクトまたは変更されたオブジェクトを指すように更新されます。
古いオブジェクトへの他の参照(モジュールの外部の名前など)は、新しいオブジェクトを参照するためにリバウンドされないため、必要に応じて、それらが発生する各名前空間で更新する必要があります。
他にもいくつかの注意点があります。
モジュールがリロードされると、そのディクショナリ(モジュールのグローバル変数を含む)が保持されます。 名前の再定義は古い定義を上書きするため、これは通常問題にはなりません。 モジュールの新しいバージョンで古いバージョンで定義された名前が定義されていない場合、古い定義が残ります。 この機能は、グローバルテーブルまたはオブジェクトのキャッシュを維持する場合にモジュールの利点として使用できます。 try ステートメントを使用して、テーブルの存在をテストし、必要に応じて初期化をスキップできます。
try: cache except NameError: cache = {}
通常、組み込みモジュールまたは動的にロードされたモジュールをリロードすることはあまり役に立ちません。 sys 、 __ main __ 、 builtins およびその他の主要モジュールをリロードすることはお勧めしません。 多くの場合、拡張モジュールは複数回初期化されるようには設計されておらず、リロード時に任意の方法で失敗する可能性があります。
モジュールが from … import …を使用して別のモジュールからオブジェクトをインポートする場合、他のモジュールに対して reload()を呼び出しても、そのモジュールからインポートされたオブジェクトは再定義されません。これを回避する方法は、 from ステートメントを再実行することです。別の方法は、代わりに import と修飾名( module.name )を使用することです。
モジュールがクラスのインスタンスをインスタンス化する場合、クラスを定義するモジュールをリロードしても、インスタンスのメソッド定義には影響しません。引き続き古いクラス定義を使用します。 同じことが派生クラスにも当てはまります。
バージョン3.4の新機能。
31.5.3。 importlib.abc –インポートに関連する抽象基本クラス
ソースコード: :source: `Lib / importlib / abc.py`
importlib.abc モジュールには、 import で使用されるすべてのコア抽象基本クラスが含まれています。 コアABCの実装を支援するために、コア抽象基本クラスのいくつかのサブクラスも提供されています。
ABC階層:
object
+-- Finder (deprecated)
| +-- MetaPathFinder
| +-- PathEntryFinder
+-- Loader
+-- ResourceLoader --------+
+-- InspectLoader |
+-- ExecutionLoader --+
+-- FileLoader
+-- SourceLoader
- class importlib.abc.Finder
ファインダーを表す抽象基本クラス。
バージョン3.3以降非推奨:代わりに MetaPathFinder または PathEntryFinder を使用してください。
- class importlib.abc.MetaPathFinder
メタパスファインダーを表す抽象基本クラス。 互換性のために、これは Finder のサブクラスです。
バージョン3.3の新機能。
- find_spec(fullname, path, target=None)
指定されたモジュールの spec を見つけるための抽象メソッド。 これがトップレベルのインポートである場合、パスは
None
になります。 それ以外の場合、これはサブパッケージまたはモジュールの検索であり、 path は親パッケージの __ path __ の値になります。 スペックが見つからない場合は、None
が返されます。 渡されると、target
は、ファインダーが返す仕様についてより知識のある推測を行うために使用できるモジュールオブジェクトです。バージョン3.4の新機能。
- find_module(fullname, path)
指定されたモジュールのローダーを見つけるためのレガシーメソッド。 これがトップレベルのインポートである場合、パスは
None
になります。 それ以外の場合、これはサブパッケージまたはモジュールの検索であり、 path は親パッケージの __ path __ の値になります。 ローダーが見つからない場合は、None
が返されます。find_spec()が定義されている場合、下位互換性のある機能が提供されます。
バージョン3.4で変更: NotImplementedError を発生させる代わりに、呼び出されたときに
None
を返します。 find_spec()を使用して機能を提供できます。バージョン3.4以降非推奨:代わりに find_spec()を使用してください。
- invalidate_caches()
呼び出されたときに、ファインダーによって使用される内部キャッシュを無効にするオプションのメソッド。 sys.meta_path 上のすべてのファインダーのキャッシュを無効にするときに、 importlib.invalidate_caches()によって使用されます。
バージョン3.4で変更:
NotImplemented
の代わりに呼び出されると、None
を返します。
- class importlib.abc.PathEntryFinder
パスエントリファインダーを表す抽象基本クラス。 MetaPathFinder といくつかの類似点がありますが、
PathEntryFinder
は、PathFinder
によって提供されるパスベースのインポートサブシステム内でのみ使用することを目的としています。 このABCは、互換性の理由からのみ Finder のサブクラスです。バージョン3.3の新機能。
- find_spec(fullname, target=None)
指定されたモジュールの spec を見つけるための抽象メソッド。 ファインダーは、モジュールが割り当てられているパスエントリ内でのみモジュールを検索します。 スペックが見つからない場合は、
None
が返されます。 渡されると、target
は、ファインダーが返す仕様についてより知識のある推測を行うために使用できるモジュールオブジェクトです。バージョン3.4の新機能。
- find_loader(fullname)
指定されたモジュールのローダーを見つけるためのレガシーメソッド。
(loader, portion)
の2タプルを返します。ここで、portion
は、名前空間パッケージの一部に寄与するファイルシステムの場所のシーケンスです。 名前空間パッケージへのファイルシステムの場所の寄与を示すためにportion
を指定している間、ローダーはNone
である可能性があります。portion
に空のリストを使用して、ローダーが名前空間パッケージの一部ではないことを示すことができます。loader
がNone
で、portion
が空のリストの場合、名前空間パッケージのローダーまたは場所が見つかりませんでした(つまり、 モジュールの何かが見つからない)。find_spec()が定義されている場合、下位互換性のある機能が提供されます。
バージョン3.4で変更: NotImplementedError を発生させる代わりに、
(None, [])
を返します。 機能を提供するために利用可能な場合、 find_spec()を使用します。バージョン3.4以降非推奨:代わりに find_spec()を使用してください。
- find_module(fullname)
self.find_loader(fullname)[0]
と同等のFinder.find_module()
の具体的な実装。バージョン3.4以降非推奨:代わりに find_spec()を使用してください。
- invalidate_caches()
呼び出されたときに、ファインダーによって使用される内部キャッシュを無効にするオプションのメソッド。 キャッシュされたすべてのファインダーのキャッシュを無効にするときに
PathFinder.invalidate_caches()
によって使用されます。
- class importlib.abc.Loader
ローダーの抽象基本クラス。 ローダーの正確な定義については、 PEP 302 を参照してください。
- create_module(spec)
モジュールのインポート時に使用するモジュールオブジェクトを返すメソッド。 このメソッドは
None
を返す場合があり、デフォルトのモジュール作成セマンティクスを実行する必要があることを示します。バージョン3.4の新機能。
バージョン3.5で変更: Python 3.6以降、 exec_module()が定義されている場合、このメソッドはオプションではなくなります。
- exec_module(module)
モジュールがインポートまたはリロードされるときに、独自の名前空間でモジュールを実行する抽象メソッド。
exec_module()
が呼び出されたときに、モジュールはすでに初期化されている必要があります。 このメソッドが存在する場合は、 create_module()を定義する必要があります。バージョン3.4の新機能。
バージョン3.6で変更: create_module()も定義する必要があります。
- load_module(fullname)
モジュールをロードするためのレガシーメソッド。 モジュールをロードできない場合は、 ImportError が発生します。それ以外の場合は、ロードされたモジュールが返されます。
要求されたモジュールが sys.modules にすでに存在する場合は、そのモジュールを使用して再ロードする必要があります。 それ以外の場合、ローダーは新しいモジュールを作成し、インポートからの再帰を防ぐために、ロードを開始する前に sys.modules に挿入する必要があります。 ローダーがモジュールを挿入し、ロードが失敗した場合、ローダーは sys.modules からモジュールを削除する必要があります。 ローダーが実行を開始する前にすでに sys.modules にあるモジュールは、そのままにしておく必要があります( importlib.util.module_for_loader()を参照)。
ローダーは、モジュールにいくつかの属性を設定する必要があります。 (これらの属性の一部は、モジュールがリロードされるときに変更される可能性があることに注意してください):
__name__
モジュールの名前。
__file__
モジュールデータが保存される場所へのパス(組み込みモジュールには設定されません)。
__cached__
モジュールのコンパイル済みバージョンが保存される/保存される必要がある場所へのパス(属性が不適切な場合は設定されません)。
__path__
パッケージ内の検索パスを指定する文字列のリスト。 この属性はモジュールには設定されていません。
__package__
モジュール/パッケージの親パッケージ。 モジュールがトップレベルの場合、空の文字列の値があります。 importlib.util.module_for_loader()デコレータは、 __ package __ の詳細を処理できます。
__loader__
モジュールのロードに使用されるローダー。 importlib.util.module_for_loader()デコレータは、 __ package __ の詳細を処理できます。
exec_module()が使用可能な場合、下位互換性のある機能が提供されます。
バージョン3.4で変更: NotImplementedError の代わりに呼び出されたときに Raise ImportError 。 exec_module()が使用可能な場合に提供される機能。
バージョン3.4以降非推奨:モジュールのロードに推奨されるAPIは exec_module()(および create_module())です。 ローダーは、load_module()の代わりにそれを実装する必要があります。 インポート機構は、exec_module()が実装されている場合、load_module()の他のすべての責任を処理します。
- module_repr(module)
実装されると、指定されたモジュールのreprを文字列として計算して返すレガシーメソッド。 モジュールタイプのデフォルトのrepr()は、このメソッドの結果を適切に使用します。
バージョン3.3の新機能。
バージョン3.4で変更: abstractmethodの代わりにオプションになりました。
バージョン3.4以降非推奨:インポート機構がこれを自動的に処理するようになりました。
- class importlib.abc.ResourceLoader
- ストレージバックエンドから任意のリソースをロードするためのオプションの PEP 302 プロトコルを実装するローダーの抽象基本クラス。
- class importlib.abc.InspectLoader
モジュールを検査するローダー用のオプションの PEP 302 プロトコルを実装するローダーの抽象基本クラス。
- get_code(fullname)
モジュールのコードオブジェクトを返します。モジュールにコードオブジェクトがない場合は
None
を返します(たとえば、組み込みモジュールの場合など)。 ローダーが要求されたモジュールを見つけられない場合は、 ImportError を発生させます。ノート
このメソッドにはデフォルトの実装がありますが、パフォーマンスのために可能であればオーバーライドすることをお勧めします。
バージョン3.4で変更:抽象化されなくなり、具体的な実装が提供されます。
- is_package(fullname)
モジュールがパッケージの場合はtrue値を返し、それ以外の場合はfalse値を返す抽象メソッド。 ImportError は、 loader がモジュールを見つけられない場合に発生します。
バージョン3.4で変更: NotImplementedError ではなく ImportError が発生します。
- static source_to_code(data, path='<string>')
Pythonソースからコードオブジェクトを作成します。
data 引数は、 compile()関数がサポートするものであれば何でもかまいません(つまり、 文字列またはバイト)。 path 引数は、ソースコードの発信元への「パス」である必要があります。これは、抽象的な概念である可能性があります(例: zipファイル内の場所)。
後続のコードオブジェクトでは、
exec(code, module.__dict__)
を実行してモジュールで実行できます。バージョン3.4の新機能。
バージョン3.5で変更:メソッドを静的にしました。
- exec_module(module)
-
バージョン3.4の新機能。
- load_module(fullname)
-
バージョン3.4以降非推奨:代わりに exec_module()を使用してください。
- class importlib.abc.ExecutionLoader
- InspectLoader から継承する抽象基本クラスで、実装すると、モジュールをスクリプトとして実行するのに役立ちます。 ABCは、オプションの PEP 302 プロトコルを表します。
- class importlib.abc.FileLoader(fullname, path)
ResourceLoader および ExecutionLoader を継承し、
ResourceLoader.get_data()
およびExecutionLoader.get_filename()
の具体的な実装を提供する抽象基本クラス。フルネーム引数は、ローダーが処理するモジュールの完全に解決された名前です。 path 引数は、モジュールのファイルへのパスです。
バージョン3.3の新機能。
- name
ローダーが処理できるモジュールの名前。
- path
モジュールのファイルへのパス。
- load_module(fullname)
スーパーの
load_module()
を呼び出します。バージョン3.4以降非推奨:代わりに Loader.exec_module()を使用してください。
- class importlib.abc.SourceLoader
ソース(およびオプションでバイトコード)ファイルのロードを実装するための抽象基本クラス。 このクラスは ResourceLoader と ExecutionLoader の両方から継承するため、次の実装が必要です。
ResourceLoader.get_data()
ExecutionLoader.get_filename()
ソースファイルへのパスのみを返す必要があります。 ソースレスロードはサポートされていません。
このクラスで定義されている抽象メソッドは、オプションのバイトコードファイルのサポートを追加することです。 これらのオプションのメソッドを実装しない(または NotImplementedError を発生させる)と、ローダーはソースコードでのみ機能します。 メソッドを実装すると、ローダーはソースおよびバイトコードファイルを操作できます。 バイトコードのみが提供される場合、ソースレスのロードは許可されません。 バイトコードファイルは、Pythonのコンパイラの解析ステップを削除することで読み込みを高速化するための最適化であるため、バイトコード固有のAPIは公開されません。
- path_stats(path)
指定されたパスに関するメタデータを含む dict を返すオプションの抽象メソッド。 サポートされている辞書キーは次のとおりです。
'mtime'
(必須):ソースコードの変更時間を表す整数または浮動小数点数。'size'
(オプション):ソースコードのバイト単位のサイズ。
将来の拡張を可能にするために、辞書内の他のキーはすべて無視されます。 パスを処理できない場合、 OSError が発生します。
バージョン3.3の新機能。
バージョン3.4で変更: NotImplementedError の代わりに Raise OSError 。
- path_mtime(path)
指定されたパスの変更時間を返すオプションの抽象メソッド。
バージョン3.3以降非推奨:このメソッドは path_stats()を優先して非推奨になりました。 実装する必要はありませんが、互換性のために引き続き使用できます。 パスを処理できない場合は、 OSError を発生させます。
バージョン3.4で変更: NotImplementedError の代わりに Raise OSError 。
- set_data(path, data)
指定されたバイトをファイルパスに書き込むオプションの抽象メソッド。 存在しない中間ディレクトリは自動的に作成されます。
パスが読み取り専用( errno.EACCES / PermissionError )であるためにパスへの書き込みが失敗した場合は、例外を伝播しないでください。
バージョン3.4で変更:呼び出されたときに NotImplementedError が発生しなくなりました。
- get_code(fullname)
InspectLoader.get_code()の具体的な実装。
- exec_module(module)
Loader.exec_module()の具体的な実装。
バージョン3.4の新機能。
- load_module(fullname)
Loader.load_module()の具体的な実装。
バージョン3.4以降非推奨:代わりに exec_module()を使用してください。
- get_source(fullname)
InspectLoader.get_source()
の具体的な実装。
- is_package(fullname)
InspectLoader.is_package()の具体的な実装。 ファイル拡張子が削除されたときにファイルパス(
ExecutionLoader.get_filename()
で提供)が__init__
という名前のファイルであり、モジュール名自体がである場合、モジュールはパッケージであると判断されます。__init__
で終わらない。
31.5.4。 importlib.machinery –インポーターとパスフック
ソースコード: :source: `Lib / importlib / machinery.py`
このモジュールには、 import がモジュールを見つけてロードするのに役立つさまざまなオブジェクトが含まれています。
- importlib.machinery.SOURCE_SUFFIXES
ソースモジュールで認識されるファイルサフィックスを表す文字列のリスト。
バージョン3.3の新機能。
- importlib.machinery.DEBUG_BYTECODE_SUFFIXES
最適化されていないバイトコードモジュールのファイルサフィックスを表す文字列のリスト。
バージョン3.3の新機能。
バージョン3.5以降非推奨:代わりに BYTECODE_SUFFIXES を使用してください。
- importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES
最適化されたバイトコードモジュールのファイルサフィックスを表す文字列のリスト。
バージョン3.3の新機能。
バージョン3.5以降非推奨:代わりに BYTECODE_SUFFIXES を使用してください。
- importlib.machinery.BYTECODE_SUFFIXES
バイトコードモジュールの認識されたファイルサフィックスを表す文字列のリスト(先頭のドットを含む)。
バージョン3.3の新機能。
バージョン3.5で変更:値は
__debug__
に依存しなくなりました。
- importlib.machinery.EXTENSION_SUFFIXES
拡張モジュールで認識されるファイルサフィックスを表す文字列のリスト。
バージョン3.3の新機能。
- importlib.machinery.all_suffixes()
標準のインポート機構によって認識されるモジュールのすべてのファイルサフィックスを表す文字列の組み合わせリストを返します。 これは、モジュールの種類に関する詳細を必要とせずに、ファイルシステムパスがモジュールを参照する可能性があるかどうかを単に知る必要があるコードのヘルパーです(たとえば、 inspect.getmodulename())。
バージョン3.3の新機能。
- class importlib.machinery.BuiltinImporter
組み込みモジュール用のインポーター。 既知のすべての組み込みモジュールは、 sys.builtin_module_names にリストされています。 このクラスは、 importlib.abc.MetaPathFinder および importlib.abc.InspectLoader ABCを実装します。
インスタンス化の必要性を軽減するために、このクラスではクラスメソッドのみが定義されています。
バージョン3.5で変更: PEP 489 の一部として、組み込みインポーターは
Loader.create_module()
およびLoader.exec_module()
を実装するようになりました。
- class importlib.machinery.FrozenImporter
凍結モジュール用のインポーター。 このクラスは、 importlib.abc.MetaPathFinder および importlib.abc.InspectLoader ABCを実装します。
インスタンス化の必要性を軽減するために、このクラスではクラスメソッドのみが定義されています。
- class importlib.machinery.WindowsRegistryFinder
Windowsレジストリで宣言されたモジュールの Finder 。 このクラスは、 importlib.abc.MetaPathFinder ABCを実装します。
インスタンス化の必要性を軽減するために、このクラスではクラスメソッドのみが定義されています。
バージョン3.3の新機能。
バージョン3.6以降非推奨:代わりにサイト構成を使用してください。 Pythonの将来のバージョンでは、デフォルトでこのファインダーが有効にならない可能性があります。
- class importlib.machinery.PathFinder
sys.path およびパッケージ
__path__
属性の Finder 。 このクラスは、 importlib.abc.MetaPathFinder ABCを実装します。インスタンス化の必要性を軽減するために、このクラスではクラスメソッドのみが定義されています。
- classmethod find_spec(fullname, path=None, target=None)
sys.path 、または定義されている場合は path の fullname で指定されたモジュールの spec を検索しようとするクラスメソッド。 検索されるパスエントリごとに、 sys.path_importer_cache がチェックされます。 false以外のオブジェクトが見つかった場合、それはパスエントリファインダーとして使用され、検索対象のモジュールを検索します。 sys.path_importer_cache にエントリが見つからない場合、 sys.path_hooks はパスエントリのファインダーを検索し、見つかった場合は sys.path_importer_cache [に保存されます。 X186X]モジュールについて照会されるとともに。 ファインダーが見つからない場合は、
None
がキャッシュに保存され、返されます。バージョン3.4の新機能。
バージョン3.5で変更:現在の作業ディレクトリ(空の文字列で表される)が無効になった場合、
None
は返されますが、値は sys.path_importer_cache にキャッシュされません。 ]。
- classmethod find_module(fullname, path=None)
find_spec()のレガシーラッパー。
バージョン3.4以降非推奨:代わりに find_spec()を使用してください。
- classmethod invalidate_caches()
sys.path_importer_cache に保存されているすべてのファインダーで importlib.abc.PathEntryFinder.invalidate_caches()を呼び出します。
バージョン3.4で変更: sys.path_hooks 内のオブジェクトを、
の現在の作業ディレクトリで呼び出します(つまり、 空の文字列)。
- class importlib.machinery.FileFinder(path, \*loader_details)
ファイルシステムからの結果をキャッシュする importlib.abc.PathEntryFinder の具体的な実装。
path 引数は、ファインダーが検索を担当するディレクトリです。
loader_details 引数は、それぞれがローダーとローダーが認識する一連のファイルサフィックスを含む可変数の2項目タプルです。 ローダーは、モジュール名と見つかったファイルへのパスの2つの引数を受け入れる呼び出し可能であることが期待されます。
ファインダーは必要に応じてディレクトリの内容をキャッシュし、各モジュール検索に対してstat呼び出しを行って、キャッシュが古くなっていないことを確認します。 キャッシュの古さは、ファイルシステムのオペレーティングシステムの状態情報の粒度に依存するため、モジュールを検索し、新しいファイルを作成してから、新しいファイルが表すモジュールを検索するという競合状態が発生する可能性があります。 操作がstat呼び出しの粒度に収まるほど高速に行われる場合、モジュール検索は失敗します。 これを防ぐために、モジュールを動的に作成するときは、必ず importlib.invalidate_caches()を呼び出してください。
バージョン3.3の新機能。
- path
ファインダーが検索するパス。
- find_spec(fullname, target=None)
パス内でフルネームを処理する仕様を見つけてください。
バージョン3.4の新機能。
- find_loader(fullname)
パス内でフルネームを処理するローダーを見つけようとします。
- invalidate_caches()
内部キャッシュをクリアします。
- classmethod path_hook(\*loader_details)
sys.path_hooks で使用するクロージャを返すクラスメソッド。 FileFinder のインスタンスは、クロージャーに直接指定されたpath引数を使用してクロージャーによって返され、 loader_details は間接的に返されます。
クロージャの引数が既存のディレクトリでない場合、 ImportError が発生します。
- class importlib.machinery.SourceFileLoader(fullname, path)
importlib.abc.FileLoader をサブクラス化し、他のメソッドのいくつかの具体的な実装を提供することによる、 importlib.abc.SourceLoader の具体的な実装。
バージョン3.3の新機能。
- name
このローダーが処理するモジュールの名前。
- path
ソースファイルへのパス。
- is_package(fullname)
path がパッケージ用であると思われる場合は、trueを返します。
- path_stats(path)
- set_data(path, data)
- load_module(name=None)
importlib.abc.Loader.load_module()の具体的な実装。ロードするモジュールの名前の指定はオプションです。
バージョン3.6以降非推奨:代わりに importlib.abc.Loader.exec_module()を使用してください。
- class importlib.machinery.SourcelessFileLoader(fullname, path)
バイトコードファイルをインポートできる importlib.abc.FileLoader の具体的な実装(つまり、 ソースコードファイルは存在しません)。
バイトコードファイル(したがってソースコードファイルではない)を直接使用すると、すべてのPython実装またはバイトコード形式を変更する新しいバージョンのPythonでモジュールを使用できなくなることに注意してください。
バージョン3.3の新機能。
- name
ローダーが処理するモジュールの名前。
- path
バイトコードファイルへのパス。
- is_package(fullname)
モジュールがパスに基づくパッケージであるかどうかを判別します。
- get_source(fullname)
このローダーを使用すると、バイトコードファイルにソースがないため、
None
を返します。
- load_module(name=None)
importlib.abc.Loader.load_module()の具体的な実装。ロードするモジュールの名前の指定はオプションです。
バージョン3.6以降非推奨:代わりに importlib.abc.Loader.exec_module()を使用してください。
- class importlib.machinery.ExtensionFileLoader(fullname, path)
拡張モジュール用の importlib.abc.ExecutionLoader の具体的な実装。
fullname 引数は、ローダーがサポートするモジュールの名前を指定します。 path 引数は、拡張モジュールのファイルへのパスです。
バージョン3.3の新機能。
- name
ローダーがサポートするモジュールの名前。
- path
拡張モジュールへのパス。
- create_module(spec)
PEP 489 に従って、指定された仕様からモジュールオブジェクトを作成します。
バージョン3.5の新機能。
- exec_module(module)
PEP 489 に従って、指定されたモジュールオブジェクトを初期化します。
バージョン3.5の新機能。
- is_package(fullname)
ファイルパスが EXTENSION_SUFFIXES に基づくパッケージの
__init__
モジュールを指している場合、True
を返します。
- get_code(fullname)
拡張モジュールにはコードオブジェクトがないため、
None
を返します。
- get_source(fullname)
拡張モジュールにはソースコードがないため、
None
を返します。
- get_filename(fullname)
パスを返します。
バージョン3.4の新機能。
- class importlib.machinery.ModuleSpec(name, loader, *, origin=None, loader_state=None, is_package=None)
モジュールのインポートシステム関連の状態の仕様。 これは通常、モジュールの
__spec__
属性として公開されます。 以下の説明では、括弧内の名前は、モジュールオブジェクトで直接使用できる対応する属性を示しています。 例えばmodule.__spec__.origin == module.__file__
。 ただし、値は通常同等ですが、2つのオブジェクト間に同期がないため、異なる場合があることに注意してください。 したがって、実行時にモジュールの__path__
を更新することが可能であり、これは__spec__.submodule_search_locations
に自動的に反映されません。バージョン3.4の新機能。
- name
(
__name__
)モジュールの完全修飾名の文字列。
- loader
(
__loader__
)ロードに使用するローダー。 名前空間パッケージの場合、これは
None
に設定する必要があります。- origin
(
__file__
)モジュールがロードされる場所の名前。例: 組み込みモジュールの場合は「builtin」、ソースからロードされたモジュールの場合はファイル名。 通常は「原点」を設定する必要がありますが、
None
(デフォルト)で指定されていない場合があります。- submodule_search_locations
(
__path__
)パッケージの場合はサブモジュールを見つける場所の文字列のリスト(それ以外の場合は
None
)。- loader_state
ロード中に使用するための追加のモジュール固有のデータのコンテナー(または
None
)。- cached
(
__cached__
)コンパイルされたモジュールを格納する場所の文字列(または
None
)。- parent
(
__package__
)(読み取り専用)モジュールがサブモジュール(または
None
)として属するパッケージの完全修飾名。- has_location
モジュールの「origin」属性がロード可能な場所を参照しているかどうかを示すブール値。
31.5.5。 importlib.util –輸入業者向けのユーティリティコード
ソースコード: :source: `Lib / importlib / util.py`
このモジュールには、 importer の構築に役立つさまざまなオブジェクトが含まれています。
- importlib.util.MAGIC_NUMBER
バイトコードのバージョン番号を表すバイト。 バイトコードのロード/書き込みについてサポートが必要な場合は、 importlib.abc.SourceLoader を検討してください。
バージョン3.4の新機能。
- importlib.util.cache_from_source(path, debug_override=None, *, optimization=None)
PEP 3147 / PEP 488 パスを、ソースパスに関連付けられたバイトコンパイル済みファイルに返します。 たとえば、 path が
/foo/bar/baz.py
の場合、Python3.2の場合の戻り値は/foo/bar/__pycache__/baz.cpython-32.pyc
になります。cpython-32
文字列は現在のマジックタグから取得されます(get_tag()
を参照してください。sys.implementation.cache_tag
が定義されていない場合、 NotImplementedError が発生します)。最適化パラメーターは、バイトコードファイルの最適化レベルを指定するために使用されます。 空の文字列は最適化がないことを表すため、最適化が
の
/foo/bar/baz.py
は、/foo/bar/__pycache__/baz.cpython-32.pyc
のバイトコードパスになります。None
により、インタープターの最適化レベルが使用されます。 他の値の文字列表現が使用されているため、最適化が2
の/foo/bar/baz.py
は、/foo/bar/__pycache__/baz.cpython-32.opt-2.pyc
のバイトコードパスになります。 最適化の文字列表現は英数字のみにすることができます。そうでない場合、 ValueError が発生します。debug_override パラメーターは非推奨であり、
__debug__
のシステム値をオーバーライドするために使用できます。True
の値は、最適化を空の文字列に設定するのと同じです。False
の値は、最適化を1
に設定するのと同じです。 debug_override と optimization の両方がNone
でない場合、 TypeError が発生します。バージョン3.4の新機能。
バージョン3.5で変更: 最適化パラメーターが追加され、 debug_override パラメーターは非推奨になりました。
バージョン3.6で変更: パスのようなオブジェクトを受け入れます。
- importlib.util.source_from_cache(path)
パスから PEP 3147 ファイル名を指定して、関連するソースコードファイルパスを返します。 たとえば、 path が
/foo/bar/__pycache__/baz.cpython-32.pyc
の場合、返されるパスは/foo/bar/baz.py
になります。 path は存在する必要はありませんが、 PEP 3147 または PEP 488 形式に準拠していない場合は、ValueError
が発生します。sys.implementation.cache_tag
が定義されていない場合、 NotImplementedError が発生します。バージョン3.4の新機能。
バージョン3.6で変更: パスのようなオブジェクトを受け入れます。
- importlib.util.decode_source(source_bytes)
ソースコードを表す指定されたバイトをデコードし、ユニバーサルニューラインを含む文字列として返します(
importlib.abc.InspectLoader.get_source()
で必要とされる場合)。バージョン3.4の新機能。
- importlib.util.resolve_name(name, package)
相対モジュール名を絶対モジュール名に解決します。
name に先頭のドットがない場合、 name が返されます。 これにより、 package 引数が必要かどうかを確認することなく、
importlib.util.resolve_name('sys', __package__)
などの使用が可能になります。ValueError は、 name が相対モジュール名であるが、パッケージがfalse値である場合に発生します(例:
None
または空の文字列)。 ValueError も発生し、相対名が含まれているパッケージをエスケープします(例:spam
パッケージ内から..bacon
を要求します)。バージョン3.3の新機能。
- importlib.util.find_spec(name, package=None)
モジュールの spec を検索します。オプションで、指定された package 名に関連します。 モジュールが sys.modules にある場合、
sys.modules[name].__spec__
が返されます(仕様がNone
であるか、設定されていない場合は、 ValueError ]が発生します)。 それ以外の場合は、 sys.meta_path を使用した検索が実行されます。 スペックが見つからない場合はNone
が返されます。name がサブモジュール(ドットを含む)用の場合、親モジュールは自動的にインポートされます。
name および package は、
import_module()
と同じように機能します。バージョン3.4の新機能。
- importlib.util.module_from_spec(spec)
spec および spec.loader.create_module に基づいて新しいモジュールを作成します。
spec.loader.create_module が
None
を返さない場合、既存の属性はリセットされません。 また、 spec にアクセスしているとき、またはモジュールに属性を設定しているときにトリガーされても、 AttributeError は発生しません。この関数は、 types.ModuleType を使用して新しいモジュールを作成するよりも優先されます。これは、 spec を使用して、モジュールにできるだけ多くのインポート制御属性を設定するためです。
バージョン3.5の新機能。
- @importlib.util.module_for_loader
importlib.abc.Loader.load_module()のデコレータは、ロードする適切なモジュールオブジェクトの選択を処理します。 装飾されたメソッドには、2つの位置引数を取る呼び出しシグネチャが必要です(例:
load_module(self, module)
)2番目の引数は、ローダーが使用するモジュールオブジェクトになります。 2つの引数を想定しているため、デコレータは静的メソッドでは機能しないことに注意してください。装飾されたメソッドは、ローダーに期待どおりにロードされるモジュールの名前を取り込みます。 モジュールが sys.modules に見つからない場合は、新しいモジュールが作成されます。 モジュールの出所に関係なく、 __ loader __ は self に設定され、 __ package __ は importlib.abc.InspectLoader.is_package()[に基づいて設定されます。 X173X]が返されます(利用可能な場合)。 これらの属性は、リロードをサポートするために無条件に設定されます。
装飾されたメソッドによって例外が発生し、モジュールが sys.modules に追加された場合、部分的に初期化されたモジュールが sys.modules に残らないように、モジュールが削除されます。 ]。 モジュールがすでに sys.modules にある場合は、そのままにしておきます。
バージョン3.3で変更: __ loader __ および __ package __ は自動的に設定されます(可能な場合)。
バージョン3.4で変更:リロードをサポートするために __ name __ 、 __ loader __ __ package __ を無条件に設定します。
バージョン3.4以降非推奨:インポート機構は、この関数によって提供されるすべての機能を直接実行するようになりました。
- @importlib.util.set_loader
importlib.abc.Loader.load_module()のデコレータは、返されたモジュールに __ loader __ 属性を設定します。 属性がすでに設定されている場合、デコレータは何もしません。 ラップされたメソッドの最初の位置引数(つまり、
self
)は、 __ loader __ に設定する必要があるものです。バージョン3.4で変更:
None
に設定されている場合は、属性が存在しないかのように__loader__
を設定します。バージョン3.4以降非推奨:インポート機構がこれを自動的に処理します。
- @importlib.util.set_package
importlib.abc.Loader.load_module()のデコレータは、返されたモジュールに __ package __ 属性を設定します。 __ package __ が設定されていて、
None
以外の値の場合、変更されません。バージョン3.4以降非推奨:インポート機構がこれを自動的に処理します。
- importlib.util.spec_from_loader(name, loader, *, origin=None, is_package=None)
ローダーに基づいて
ModuleSpec
インスタンスを作成するためのファクトリ関数。 パラメータは、ModuleSpecの場合と同じ意味を持ちます。 この関数は、InspectLoader.is_package()
などの利用可能な loader APIを使用して、仕様に関する不足している情報を入力します。バージョン3.4の新機能。
- importlib.util.spec_from_file_location(name, location, *, loader=None, submodule_search_locations=None)
ファイルへのパスに基づいて
ModuleSpec
インスタンスを作成するためのファクトリ関数。 不足している情報は、ローダーAPIを利用し、モジュールがファイルベースになることを意味することにより、仕様に記入されます。バージョン3.4の新機能。
バージョン3.6で変更: パスのようなオブジェクトを受け入れます。
- class importlib.util.LazyLoader(loader)
モジュールが属性にアクセスするまで、モジュールのローダーの実行を延期するクラス。
このクラスのみは、 exec_module()を、モジュールに使用されるモジュールタイプの制御が必要であると定義するローダーで機能します。 同じ理由で、ローダーの create_module()メソッドは、
None
、または slot [を使用せずに__class__
属性を変更できるタイプを返す必要があります。 X180X]。 最後に、 sys.modules に配置されたオブジェクトを置き換えるモジュールは、インタープリター全体でモジュール参照を安全に適切に置き換える方法がないため、機能しません。 ValueError は、そのような置換が検出された場合に発生します。ノート
起動時間が重要なプロジェクトの場合、このクラスを使用すると、モジュールを使用しない場合にモジュールをロードするコストを最小限に抑えることができます。 起動時間が必須ではないプロジェクトの場合、ロード中に作成されたエラーメッセージが延期され、コンテキスト外で発生するため、このクラスの使用は大幅に推奨されません。
バージョン3.5の新機能。
バージョン3.6で変更: create_module()の呼び出しを開始し、 importlib.machinery.BuiltinImporter および importlib.machinery.ExtensionFileLoader の互換性警告を削除しました]。
- classmethod factory(loader)
レイジーローダーを作成する呼び出し可能オブジェクトを返す静的メソッド。 これは、ローダーがインスタンスではなくクラスによって渡される状況で使用することを目的としています。
suffixes = importlib.machinery.SOURCE_SUFFIXES loader = importlib.machinery.SourceFileLoader lazy_loader = importlib.util.LazyLoader.factory(loader) finder = importlib.machinery.FileFinder(path, (lazy_loader, suffixes))
31.5.6。 例
31.5.6.1。 プログラムによるインポート
プログラムでモジュールをインポートするには、 importlib.import_module()を使用します。
import importlib
itertools = importlib.import_module('itertools')
31.5.6.2。 モジュールをインポートできるかどうかの確認
実際にインポートを行わずにモジュールをインポートできるかどうかを確認する必要がある場合は、 importlib.util.find_spec()を使用する必要があります。
import importlib.util
import sys
# For illustrative purposes.
name = 'itertools'
spec = importlib.util.find_spec(name)
if spec is None:
print("can't find the itertools module")
else:
# If you chose to perform the actual import ...
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
# Adding the module to sys.modules is optional.
sys.modules[name] = module
31.5.6.3。 ソースファイルを直接インポートする
Pythonソースファイルを直接インポートするには、次のレシピを使用します(Python 3.5以降のみ)。
import importlib.util
import sys
# For illustrative purposes.
import tokenize
file_path = tokenize.__file__
module_name = tokenize.__name__
spec = importlib.util.spec_from_file_location(module_name, file_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
# Optional; only necessary if you want to be able to import the module
# by name later.
sys.modules[module_name] = module
31.5.6.4。 インポーターの設定
インポートを大幅にカスタマイズするには、通常、インポーターを実装する必要があります。 これは、物事のファインダー側とローダー側の両方を管理することを意味します。 ファインダーの場合、ニーズに応じて2つのフレーバーを選択できます。メタパスファインダーまたはパスエントリファインダーです。 前者は sys.meta_path に配置するものであり、後者はで動作する sys.path_hooks のパスエントリフックを使用して作成するものです。 ] sys.path エントリは、ファインダーを作成する可能性があります。 この例では、インポートがそれらを使用するように独自のインポーターを登録する方法を示します(自分用のインポーターを作成するには、このパッケージ内で定義されている適切なクラスのドキュメントをお読みください)。
import importlib.machinery
import sys
# For illustrative purposes only.
SpamMetaPathFinder = importlib.machinery.PathFinder
SpamPathEntryFinder = importlib.machinery.FileFinder
loader_details = (importlib.machinery.SourceFileLoader,
importlib.machinery.SOURCE_SUFFIXES)
# Setting up a meta path finder.
# Make sure to put the finder in the proper location in the list in terms of
# priority.
sys.meta_path.append(SpamMetaPathFinder)
# Setting up a path entry finder.
# Make sure to put the path hook in the proper location in the list in terms
# of priority.
sys.path_hooks.append(SpamPathEntryFinder.path_hook(loader_details))
31.5.6.5。 概算 importlib.import_module()
インポート自体はPythonコードで実装されているため、importlibを介してほとんどのインポート機構を公開できます。 以下は、 importlib.import_module()(importlibの使用法についてはPython 3.4以降、コードの他の部分についてはPython 3.6以降)のおおよその実装を提供することにより、importlibが公開するさまざまなAPIを説明するのに役立ちます。
import importlib.util
import sys
def import_module(name, package=None):
"""An approximate implementation of import."""
absolute_name = importlib.util.resolve_name(name, package)
try:
return sys.modules[absolute_name]
except KeyError:
pass
path = None
if '.' in absolute_name:
parent_name, _, child_name = absolute_name.rpartition('.')
parent_module = import_module(parent_name)
path = parent_module.__spec__.submodule_search_locations
for finder in sys.meta_path:
spec = finder.find_spec(absolute_name, path)
if spec is not None:
break
else:
msg = f'No module named {absolute_name!r}'
raise ModuleNotFoundError(msg, name=absolute_name)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
sys.modules[absolute_name] = module
if path is not None:
setattr(parent_module, child_name, module)
return module