importlib —インポートの実装—Pythonドキュメント

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

importlib — importの実装

バージョン3.1の新機能。


ソースコード: :source: `Lib / importlib / __ init __。py`



序章

importlib パッケージの目的は2つあります。 1つは、Pythonソースコードで import ステートメント(したがって、拡張により、 __ import __()関数)の実装を提供することです。 これにより、Pythonインタープリターに移植可能なimportの実装が提供されます。 これにより、Python以外のプログラミング言語で実装されたものよりも理解しやすい実装も提供されます。

2つ目は、 import を実装するコンポーネントがこのパッケージで公開されているため、ユーザーは独自のカスタムオブジェクト(総称して importer )を作成してインポートプロセスに参加できます。

も参照してください

インポートステートメント
import ステートメントの言語リファレンス。
パッケージ仕様
パッケージのオリジナル仕様。 このドキュメントの作成以降、一部のセマンティクスが変更されました(例: sys.modulesNoneに基づいてリダイレクトします。
__ import __()関数
import ステートメントは、この関数のシンタックスシュガーです。
PEP 235
大文字と小文字を区別しないプラットフォームへのインポート
PEP 263
Pythonソースコードエンコーディングの定義
PEP 302
新しいインポートフック
PEP 328
輸入:マルチラインおよび絶対/相対
PEP 366
メインモジュールの明示的な相対インポート
PEP 420
暗黙の名前空間パッケージ
PEP 451
インポートシステムのModuleSpecタイプ
PEP 488
PYOファイルの削除
PEP 489
マルチフェーズ拡張モジュールの初期化
PEP 552
決定論的pycs
PEP 3120
デフォルトのソースエンコーディングとしてUTF-8を使用する
PEP 3147
PYCリポジトリディレクトリ


関数

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 およびその他の主要モジュールをリロードすることはお勧めしません。 多くの場合、拡張モジュールは複数回初期化されるようには設計されておらず、リロード時に任意の方法で失敗する可能性があります。

モジュールが fromimport …を使用して別のモジュールからオブジェクトをインポートする場合、他のモジュールに対して reload()を呼び出しても、そのモジュールからインポートされたオブジェクトは再定義されません。これを回避する方法は、fromステートメントを再実行することです。別の方法は、代わりにimportと修飾名( module.name )を使用することです。

モジュールがクラスのインスタンスをインスタンス化する場合、クラスを定義するモジュールをリロードしても、インスタンスのメソッド定義には影響しません。引き続き古いクラス定義を使用します。 同じことが派生クラスにも当てはまります。

バージョン3.4の新機能。

バージョン3.7で変更: ModuleNotFoundError は、リロードされるモジュールにModuleSpecがない場合に発生します。


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は、ファインダーが返す仕様についてより知識のある推測を行うために使用できるモジュールオブジェクトです。 importlib.util.spec_from_loader()は、具象MetaPathFindersの実装に役立つ場合があります。

バージョン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は、ファインダーが返す仕様についてより知識のある推測を行うために使用できるモジュールオブジェクトです。 importlib.util.spec_from_loader()は、具象PathEntryFindersの実装に役立つ場合があります。

バージョン3.4の新機能。

find_loader(fullname)

指定されたモジュールのローダーを見つけるためのレガシーメソッド。 (loader, portion)の2タプルを返します。ここで、portionは、名前空間パッケージの一部に寄与するファイルシステムの場所のシーケンスです。 名前空間パッケージへのファイルシステムの場所の寄与を示すためにportionを指定している間、ローダーはNoneである可能性があります。 portionに空のリストを使用して、ローダーが名前空間パッケージの一部ではないことを示すことができます。 loaderNoneで、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 を参照してください。

リソースの読み取りをサポートするローダーは、 importlib.abc.ResourceReader で指定されているget_resource_reader(fullname)メソッドを実装する必要があります。

バージョン3.7で変更:オプションのget_resource_reader()メソッドが導入されました。

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__

    モジュールがサブモジュールとしてロードされたパッケージの完全修飾名(または最上位モジュールの場合は空の文字列)。 パッケージの場合、 __ name __ と同じです。 importlib.util.module_for_loader()デコレータは、 __ package __ の詳細を処理できます。

  • __loader__

    モジュールのロードに使用されるローダー。 importlib.util.module_for_loader()デコレータは、 __ package __ の詳細を処理できます。

exec_module()が使用可能な場合、下位互換性のある機能が提供されます。

バージョン3.4で変更: NotImplementedError の代わりに呼び出されたときに Raise ImportErrorexec_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.ResourceReader

TraversableResourcesに置き換えられました

抽象基本クラスは、リソースを読み取る機能を提供します。

このABCの観点から、リソースはパッケージ内で出荷されるバイナリアーティファクトです。 通常、これはパッケージの__init__.pyファイルの隣にあるデータファイルのようなものです。 このクラスの目的は、そのようなデータファイルへのアクセスを抽象化して、パッケージとそのデータファイルがegに格納されているかどうかが問題にならないようにすることです。 zipファイルとファイルシステム。

このクラスのどのメソッドでも、 resource 引数は、概念的にはファイル名だけを表すパスのようなオブジェクトであることが期待されます。 これは、 resource 引数にサブディレクトリパスを含めないことを意味します。 これは、リーダーの対象となるパッケージの場所が「ディレクトリ」として機能するためです。 したがって、ディレクトリとファイル名のメタファーは、それぞれパッケージとリソースです。 これは、このクラスのインスタンスが(複数のパッケージまたはモジュールを表す可能性があるのではなく)特定のパッケージに直接相関することが期待される理由でもあります。

リソースの読み取りをサポートしたいローダーは、このABCのインターフェースを実装するオブジェクトを返すget_resource_reader(fullname)と呼ばれるメソッドを提供することが期待されています。 fullnameで指定されたモジュールがパッケージでない場合、このメソッドは None を返す必要があります。 このABCと互換性のあるオブジェクトは、指定されたモジュールがパッケージである場合にのみ返されます。

バージョン3.7の新機能。

class importlib.abc.ResourceLoader

ストレージバックエンドから任意のリソースをロードするためのオプションの PEP 302 プロトコルを実装するローダーの抽象基本クラス。

バージョン3.7以降非推奨:このABCは、 importlib.abc.ResourceReader を介したリソースの読み込みをサポートするために非推奨になりました。

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)

Loader.exec_module()の実装。

バージョン3.4の新機能。

load_module(fullname)

Loader.load_module()の実装。

バージョン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

ソース(およびオプションでバイトコード)ファイルのロードを実装するための抽象基本クラス。 このクラスは ResourceLoaderExecutionLoader の両方から継承するため、次の実装が必要です。

  • 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__で終わらない。

class importlib.abc.Traversable

ディレクトリのトラバースとファイルのオープンに適したpathlib.Pathメソッドのサブセットを持つオブジェクト。

バージョン3.9の新機能。

class importlib.abc.TraversableResources

filesインターフェースを提供できるリソースリーダーの抽象基本クラス。 ResourceReaderをサブクラス化し、ResourceReaderの抽象メソッドの具体的な実装を提供します。 したがって、TraversableReaderを提供するローダーはResourceReaderも提供します。

バージョン3.9の新機能。


importlib.resources –リソース

ソースコード: :source: `Lib / importlib / resources.py`



バージョン3.7の新機能。


このモジュールは、Pythonのインポートシステムを利用して、パッケージ内のリソースへのアクセスを提供します。 パッケージをインポートできる場合は、そのパッケージ内のリソースにアクセスできます。 リソースは、バイナリモードまたはテキストモードで開いたり読み取ったりできます。

リソースはディレクトリ内のファイルとほぼ同じですが、これは単なる比喩であることに留意することが重要です。 リソースとパッケージは、ファイルシステム上に物理ファイルおよびディレクトリとして存在する必要はありません

ノート

このモジュールは、 pkg_resources Basic Resource Access と同様の機能を、そのパッケージのパフォーマンスオーバーヘッドなしで提供します。 これにより、パッケージに含まれるリソースの読み取りが容易になり、セマンティクスがより安定して一貫性のあるものになります。

このモジュールのスタンドアロンバックポートは、 importlib.resources の使用および pkg_resourcesからimportlib.resources への移行に関する詳細情報を提供します。


リソースの読み取りをサポートするローダーは、 importlib.abc.ResourceReader で指定されているget_resource_reader(fullname)メソッドを実装する必要があります。

以下のタイプが定義されています。

importlib.resources.Package
PackageタイプはUnion[str, ModuleType]として定義されます。 これは、関数がPackageの受け入れについて説明している場合、文字列またはモジュールのいずれかを渡すことができることを意味します。 モジュールオブジェクトには、Noneではない解決可能な__spec__.submodule_search_locationsが必要です。
importlib.resources.Resource
このタイプは、このパッケージのさまざまな関数に渡されるリソース名を記述します。 これはUnion[str, os.PathLike]として定義されます。

以下の機能が利用できます。

importlib.resources.files(package)

パッケージのリソースコンテナ(thinkディレクトリ)とそのリソース(thinkファイル)を表すimportlib.resources.abc.Traversableオブジェクトを返します。 Traversableには、他のコンテナが含まれている場合があります(サブディレクトリを考えてください)。

package は、Package要件に準拠する名前またはモジュールオブジェクトのいずれかです。

バージョン3.9の新機能。

importlib.resources.as_file(traversable)

通常は importlib.resources.files()からのファイルを表すimportlib.resources.abc.Traversableオブジェクトを指定すると、 with ステートメントで使用するコンテキストマネージャーを返します。 コンテキストマネージャーは、 pathlib.Path オブジェクトを提供します。

コンテキストマネージャーを終了すると、リソースが抽出されたときに作成された一時ファイルがクリーンアップされます。 zipファイル。

Traversableメソッド(read_textなど)が不十分で、ファイルシステム上の実際のファイルが必要な場合は、as_fileを使用します。

バージョン3.9の新機能。

importlib.resources.open_binary(package, resource)

パッケージ内のリソースをバイナリ読み取りするために開きます。

package は、Package要件に準拠する名前またはモジュールオブジェクトのいずれかです。 resource は、 package 内で開くリソースの名前です。 パス区切り文字が含まれていない可能性があり、サブリソースが含まれていない可能性があります(つまり、 ディレクトリにすることはできません)。 この関数は、読み取り用に開いているバイナリI / Oストリームであるtyping.BinaryIOインスタンスを返します。

importlib.resources.open_text(package, resource, encoding='utf-8', errors='strict')

パッケージ内のリソースを読み取るテキスト用に開きます。 デフォルトでは、リソースはUTF-8として読み取るために開かれています。

package は、Package要件に準拠する名前またはモジュールオブジェクトのいずれかです。 resource は、 package 内で開くリソースの名前です。 パス区切り文字が含まれていない可能性があり、サブリソースが含まれていない可能性があります(つまり、 ディレクトリにすることはできません)。 エンコーディングおよびエラーは、組み込みの open()と同じ意味です。

この関数は、typing.TextIOインスタンスを返します。これは、読み取り用に開いているテキストI / Oストリームです。

importlib.resources.read_binary(package, resource)

パッケージ内のリソースの内容をbytesとして読み取り、返します。

package は、Package要件に準拠する名前またはモジュールオブジェクトのいずれかです。 resource は、 package 内で開くリソースの名前です。 パス区切り文字が含まれていない可能性があり、サブリソースが含まれていない可能性があります(つまり、 ディレクトリにすることはできません)。 この関数は、リソースの内容を bytes として返します。

importlib.resources.read_text(package, resource, encoding='utf-8', errors='strict')

パッケージ内のリソースの内容を読み取り、strとして返します。 デフォルトでは、コンテンツは厳密なUTF-8として読み取られます。

package は、Package要件に準拠する名前またはモジュールオブジェクトのいずれかです。 resource は、 package 内で開くリソースの名前です。 パス区切り文字が含まれていない可能性があり、サブリソースが含まれていない可能性があります(つまり、 ディレクトリにすることはできません)。 エンコーディングおよびエラーは、組み込みの open()と同じ意味です。 この関数は、リソースの内容を str として返します。

importlib.resources.path(package, resource)

リソースへのパスを実際のファイルシステムパスとして返します。 この関数は、 with ステートメントで使用するコンテキストマネージャーを返します。 コンテキストマネージャーは、 pathlib.Path オブジェクトを提供します。

コンテキストマネージャーを終了すると、リソースを抽出する必要があるときに作成された一時ファイルがクリーンアップされます。 zipファイル。

package は、Package要件に準拠する名前またはモジュールオブジェクトのいずれかです。 resource は、 package 内で開くリソースの名前です。 パス区切り文字が含まれていない可能性があり、サブリソースが含まれていない可能性があります(つまり、 ディレクトリにすることはできません)。

importlib.resources.is_resource(package, name)
パッケージに name という名前のリソースがある場合は、Trueを返します。それ以外の場合は、Falseを返します。 ディレクトリはではなくリソースであることを忘れないでください! package は、Package要件に準拠する名前またはモジュールオブジェクトのいずれかです。
importlib.resources.contents(package)

パッケージ内の指定されたアイテムに対して反復可能オブジェクトを返します。 iterableは str リソースを返します(例: ファイル)および非リソース(例: ディレクトリ)。 iterableはサブディレクトリに再帰しません。

package は、Package要件に準拠する名前またはモジュールオブジェクトのいずれかです。


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を実装します。

インスタンス化の必要性を軽減するために、このクラスではクラスメソッドのみが定義されています。

バージョン3.4で変更: create_module()およびexec_module()メソッドを取得しました。

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 または定義されている場合は pathfullname で指定されたモジュールの 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()を呼び出します。 それ以外の場合、Noneに設定された sys.path_importer_cache のエントリは削除されます。

バージョン3.7で変更: sys.path_importer_cacheNoneのエントリが削除されます。

バージョン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)

パスがパッケージ用であると思われる場合は、Trueを返します。

path_stats(path)

importlib.abc.SourceLoader.path_stats()の具体的な実装。

set_data(path, data)

importlib.abc.SourceLoader.set_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_code(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__

モジュールをロードするときに使用する必要があるローダーファインダーは常にこれを設定する必要があります。

origin

__file__

モジュールがロードされる場所の名前。例: 組み込みモジュールの場合は「builtin」、ソースからロードされたモジュールの場合はファイル名。 通常は「原点」を設定する必要がありますが、None(デフォルト)の場合があり、指定されていないことを示します(例: 名前空間パッケージの場合)。

submodule_search_locations

__path__

パッケージの場合はサブモジュールを見つける場所の文字列のリスト(それ以外の場合はNone)。

loader_state

ロード中に使用するための追加のモジュール固有のデータのコンテナー(またはNone)。

cached

__cached__

コンパイルされたモジュールを格納する場所の文字列(またはNone)。

parent

__package__

(読み取り専用)モジュールをサブモジュールとしてロードするパッケージの完全修飾名(または最上位モジュールの場合は空の文字列)。 パッケージの場合、 __ name __ と同じです。

has_location

モジュールの「origin」属性がロード可能な場所を参照しているかどうかを示すブール値。


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_overrideoptimization の両方が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', __spec__.parent)などの使用が可能になります。

ImportError は、 name が相対モジュール名であるが、 package が偽の値である場合に発生します(例: Noneまたは空の文字列)。 ImportError も発生し、相対名が含まれているパッケージをエスケープします(例: spamパッケージ内から..baconを要求します)。

バージョン3.3の新機能。

バージョン3.9で変更:インポートステートメントとの一貫性を向上させるために、無効な相対インポート試行に対して ValueError ではなく ImportError を発生させます。

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の新機能。

バージョン3.7で変更: package が実際にパッケージではない場合、AttributeError ではなく ModuleNotFoundError を発生させます(つまり __ path __ 属性がありません)。

importlib.util.module_from_spec(spec)

spec および spec.loader.create_module に基づいて新しいモジュールを作成します。

spec.loader.create_moduleNoneを返さない場合、既存の属性はリセットされません。 また、 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で変更: パスのようなオブジェクトを受け入れます。

importlib.util.source_hash(source_bytes)

source_bytes のハッシュをバイトとして返します。 ハッシュベースの.pycファイルは、対応するソースファイルのコンテンツの source_hash()をヘッダーに埋め込みます。

バージョン3.7の新機能。

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))


プログラムによるインポート

プログラムでモジュールをインポートするには、 importlib.import_module()を使用します。

import importlib

itertools = importlib.import_module('itertools')

モジュールをインポートできるかどうかの確認

実際にインポートを行わずにモジュールをインポートできるかどうかを確認する必要がある場合は、 importlib.util.find_spec()を使用する必要があります。

import importlib.util
import sys

# For illustrative purposes.
name = 'itertools'

if name in sys.modules:
    print(f"{name!r} already in sys.modules")
elif (spec := importlib.util.find_spec(name)) is not None:
    # If you chose to perform the actual import ...
    module = importlib.util.module_from_spec(spec)
    sys.modules[name] = module
    spec.loader.exec_module(module)
    print(f"{name!r} has been imported")
else:
    print(f"can't find the {name!r} module")

ソースファイルを直接インポートする

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)
sys.modules[module_name] = module
spec.loader.exec_module(module)

インポーターの設定

インポートを大幅にカスタマイズするには、通常、インポーターを実装する必要があります。 これは、物事のファインダー側とローダー側の両方を管理することを意味します。 ファインダーの場合、ニーズに応じて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))

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)
    sys.modules[absolute_name] = module
    spec.loader.exec_module(module)
    if path is not None:
        setattr(parent_module, child_name, module)
    return module