Pythonのimportlibを使ったインポート処理の実装方法を徹底解説
importlibパッケージは、Pythonのimport文の実装を純粋なPythonコードとして提供する標準ライブラリです。そのため、どのPythonインタープリタにも移植可能であり、C言語などPython以外の言語で実装された内部処理よりも格段に理解しやすいのが特徴です。
さらに、importlibはインポート機構を構成する各コンポーネントを公開しているため、開発者が独自のカスタムオブジェクト(インポーターと呼ばれます)を作成し、インポートプロセスに組み込むことも簡単に行えます。
ここでは、importlibパッケージの主要な関数とサブモジュールについて詳しく見ていきましょう。
importlibの主要な関数
import_module()
この関数は、プログラム内から動的にモジュールをインポートします。第1引数にはモジュール名を指定し、省略可能な第2引数にはパッケージ名を指定できます。
invalidate_caches()
この関数は、ファインダー(finder)が保持する内部キャッシュを無効化します。プログラムの実行中に新しいモジュールを作成・インストールした場合は、この関数を呼び出すことで、すべてのファインダーが新しいモジュールの存在を確実に認識できるようになります。
reload()
この関数は、すでにインポート済みのモジュールを再読み込みします。外部エディタでモジュールのソースファイルを編集した後、Pythonインタープリタを終了することなく新しいバージョンを試したい場合に非常に便利です。
動的インポートの実行例
まず、module1.pyとmodule2.pyという2つのPythonスクリプトを作成し、両方に以下の同じコードを記述します。
#module1
def main():
print ('module imported', __name__)
return
if __name__=='__main__':
main()
続いて、importlibパッケージを使ってこれらのモジュールを動的にインポートしてみます。
>>> import importlib
>>> mod=importlib.import_module('module1')
>>> mod.__name__
'module1'
>>> mod=importlib.import_module('module2')
>>> mod.__name__
'module2'
>>> mod.main()
module imported module2
>>>
このように、import_module()を使えば文字列で指定したモジュール名から、実行時に柔軟にモジュールを取得できます。
importlibの主なサブモジュール
importlibパッケージには、以下のようなサブモジュールが含まれています。
importlib.abc
インポート処理で使用されるすべてのコア抽象基底クラス(ABC)を含むモジュールです。コアABCの実装を支援するためのサブクラスもいくつか提供されています。
importlib.resources
Pythonのインポートシステムを活用し、パッケージ内に含まれるデータファイルなどのリソースへのアクセスを提供するモジュールです。
importlib.machinery
インポート処理がモジュールを検索・ロードする際に役立つ、さまざまなオブジェクトを格納したモジュールです。
importlib.util
インポーターを作成するためのユーティリティコードを提供するモジュールです。インポーターの構築に役立つさまざまなオブジェクトが含まれており、以下の重要な関数が定義されています。
importlib.utilの重要な関数
find_spec()
この関数は、指定されたパッケージ名を基準に、モジュールの仕様(spec)を検索します。名前にドットが含まれる場合(サブモジュールの場合)、親モジュールは自動的にインポートされます。nameとpackage引数の挙動はimport_module()と同じです。
module_from_spec(spec)
specとspec.loader.create_moduleに基づいて、新しいモジュールオブジェクトを生成します。
モジュールの存在確認とインポートの実装例
以下の例では、find_spec()でモジュールの存在を確認し、インポート可能であればmodule_from_spec()を使って実際にロードしています。
import importlib.util
def check_module(mod):
spec = importlib.util.find_spec(mod)
if spec is None:
print('Module: {} not found'.format(mod))
return None
else:
print('Module: {} can be imported!'.format(mod))
return spec
def import_module(spec):
mod = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mod)
return mod
if __name__ == '__main__':
spec = check_module('notamodule')
spec = check_module('module1')
if spec:
mod = import_module(spec)
mod.main()
実行結果
Module: notamodule not found Module: module1 can be imported! module imported module1
このように、importlibを活用することで、プラグインの動的読み込みや設定に応じたモジュール選択など、柔軟なインポート処理を実現できます。まずはimport_module()やfind_spec()といった基本関数から試してみることをおすすめします。
-
Python CSVモジュール入門:CSVファイルの読み書きをステップバイステップで解説
Pythonのcsvモジュールは、CSVファイルを扱うための標準ライブラリです。CSVファイルには大量の情報を格納でき、csvモジュールのreader()関数とwriter()関数を使えば、PythonからCSVファイルを簡単に読み書きできます。 データの読み取り、書き込み、操作はプログラミングに欠かせない要素です。外部ソースからデータを読み込んだり書き出したりできるようになれば、Pythonでのファイル処理の幅が大きく広がります。 例えば、あなたが地元のアイスクリーム店のオーナーで、顧客の購買傾向をもっと詳しく知りたいとしましょう。Pythonを使えば、収集した注文データを分析して、
-
Pythonのpydocモジュールを使ったドキュメント生成の完全ガイド
はじめにpydocモジュールは、Pythonモジュールから自動的にドキュメントを生成するための標準ライブラリです。生成されたドキュメントは、コンソール上にテキストとして表示できるだけでなく、Webブラウザでの閲覧やHTMLファイルとしての保存にも対応しています。この記事では、さまざまな場面でドキュメントを確認する方法を解説するとともに、自分のPythonスクリプト用のドキュメントを作成する際に役立つdocstring(ドキュメンテーション文字列)についても詳しく学びます。それでは、pydocの具体的な使い方を見ていきましょう。準備:pydocのインポートpydocモジュールはPythonに最初