はじめに
この実験では、Python でモジュールがインポートされているかどうかを確認する方法を学びます。この実験では、簡単なモジュールの作成とインポートを含む、モジュールのインポートの基本について説明します。import 文を使用してモジュールをプログラムに取り込み、その関数や変数にアクセスする方法を学びます。
次に、現在の Python セッションでインポートされたすべてのモジュールを格納する sys.modules 辞書について調べます。また、importlib モジュールを使用してモジュールがインポートされているかどうかを確認する方法も学びます。
モジュールインポートについて学ぶ
このステップでは、Python のモジュールのインポートについて学びます。モジュールは、Python の定義や文が含まれたファイルです。import 文は、モジュールを現在のプログラムに取り込むために使用され、モジュール内で定義された関数や変数を使用することができます。
まず、簡単なモジュールを作成しましょう。LabEx 環境で VS Code エディタを開き、~/project ディレクトリに my_module.py という名前の新しいファイルを作成します。
## ~/project/my_module.py
def greet(name):
return f"Hello, {name}!"
PI = 3.14159
このモジュールでは、greet 関数と PI 変数が定義されています。次に、このモジュールをインポートして使用する別の Python ファイルを作成しましょう。~/project ディレクトリに main.py という名前の新しいファイルを作成します。
## ~/project/main.py
import my_module
name = "LabEx User"
greeting = my_module.greet(name)
print(greeting)
print("PI =", my_module.PI)
この main.py ファイルでは、import my_module 文を使用して、先ほど作成した my_module を取り込んでいます。その後、ドット表記 (my_module.greet, my_module.PI) を使用して greet 関数と PI 変数にアクセスしています。
このコードを実行するには、LabEx 環境でターミナルを開きます(VS Code の下部パネルにすでに開いているはずです)。現在のディレクトリが ~/project であることを確認してください。そうでない場合は、cd コマンドを使用して移動します。
cd ~/project
次に、python コマンドを使用して main.py スクリプトを実行します。
python main.py
以下の出力が表示されるはずです。
Hello, LabEx User!
PI = 3.14159
これは、モジュールをインポートして別の Python ファイルでその内容を使用する方法を示しています。
sys.modules 辞書を確認する
このステップでは、Python のモジュールインポートシステムの重要な部分である sys.modules 辞書を調べます。sys.modules は、現在の Python セッションにインポートされたすべてのモジュールを保持する辞書です。この辞書を理解することで、Python がモジュールを管理する方法を理解するのに役立ちます。
まず、~/project ディレクトリに check_modules.py という名前の Python スクリプトを作成しましょう。このスクリプトは sys モジュールをインポートし、sys.modules 辞書のキーを出力します。
## ~/project/check_modules.py
import sys
print("Modules currently in sys.modules:")
for module_name in sys.modules.keys():
print(module_name)
import my_module
print("\nModules after importing my_module:")
for module_name in sys.modules.keys():
print(module_name)
このスクリプトは最初に sys モジュールをインポートします。その後、sys.modules 辞書のキーを繰り返し処理し、各モジュール名を出力します。その後、前のステップで作成した my_module をインポートし、再度 sys.modules 辞書を出力して、新しくインポートされたモジュールを表示します。
次に、ターミナルで python コマンドを使用してスクリプトを実行します。
cd ~/project
python check_modules.py
Python インタープリターが起動するときにすでに読み込まれているモジュールのリストが表示され、import my_module 文の後に my_module が追加された同じリストが表示されます。出力は次のようになります(モジュールの正確なリストは異なる場合があります)。
Modules currently in sys.modules:
builtins
sys
_frozen_importlib
_imp
_warnings
_io
... (many more modules)
Modules after importing my_module:
builtins
sys
_frozen_importlib
_imp
_warnings
_io
... (many more modules)
my_module
import 文の後に my_module が sys.modules 辞書に追加されていることに注意してください。この辞書はキャッシュとして機能するため、同じモジュールを再度インポートしようとすると、Python はディスクから再読み込みするのではなく、sys.modules からそれを取得します。この最適化により、パフォーマンスが向上します。
importlib を使用して検証する
このステップでは、importlib モジュールを使ってプログラム的にモジュールをインポートし、その存在を検証する方法を学びます。importlib は Python の標準ライブラリの一部で、インポートシステムとやり取りする方法を提供します。
~/project ディレクトリに verify_import.py という名前の Python スクリプトを作成しましょう。このスクリプトは importlib を使って my_module をインポートし、正常にインポートされたかどうかを確認します。
## ~/project/verify_import.py
import importlib
module_name = "my_module"
try:
module = importlib.import_module(module_name)
print(f"Module '{module_name}' imported successfully.")
print(f"Greeting: {module.greet('LabEx')}")
except ImportError:
print(f"Failed to import module '{module_name}'.")
このスクリプトでは、importlib.import_module() を使って my_module をインポートしています。モジュールが見つかり、正常にインポートされた場合、スクリプトは成功メッセージを出力し、モジュールの greet 関数を呼び出します。モジュールが見つからない場合、ImportError が発生し、スクリプトはエラーメッセージを出力します。
次に、ターミナルで python コマンドを使ってスクリプトを実行します。
cd ~/project
python verify_import.py
以下の出力が表示されるはずです。
Module 'my_module' imported successfully.
Greeting: Hello, LabEx!
module_name を存在しないモジュール名(例えば "nonexistent_module")に変更してスクリプトを再度実行すると、次のような出力が表示されます。
Failed to import module 'nonexistent_module'.
これは、importlib を使って動的にモジュールをインポートし、潜在的なインポートエラーを処理する方法を示しています。これは、ユーザー入力や設定ファイルに基づいてモジュールをロードする必要がある状況で特に有用です。
まとめ
この実験では、Python のモジュールインポートについて学びました。greet 関数と PI 変数を含む my_module.py という名前のモジュールを作成しました。その後、main.py を作成して my_module をインポートし、その内容を使用しました。これにより、import 文がどのようにモジュールをプログラムに取り込むか、およびドット表記を使用してモジュール内の関数や変数にアクセスする方法を示しました。
また、現在の Python セッションにインポートされたすべてのモジュールを保持する sys.modules 辞書を調べ始めました。これは Python のモジュールインポートシステムの重要な部分です。



