"""tkimport.py
概要: 動的にモジュールをインポートし、エラー処理を行うユーティリティモジュール。
詳細説明:
本モジュールは、Pythonのimportlibを使用して動的にモジュールをインポートする機能を提供します。
インポートの成功/失敗を管理し、失敗した場合にはユーザーに適切なメッセージを表示し、
設定に応じてプログラムを終了するか、警告として処理を継続するかを制御します。
インポートされたモジュールは内部のキャッシュに保存され、重複したインポートを避けます。
関連リンク:
:doc:`tkimport_usage`
"""
try:
from importlib import import_module
except:
print("\nError: Failed to import [importlib] module.\n")
input("\nPress ENTER to terminate>>\n\n")
exit()
from tklib.tkobject import tkObject
imported_modules = {}
error_modules = {}
[ドキュメント]
def import_lib(module_name, stop_by_error = True):
"""指定されたモジュールを動的にインポートし、エラーを処理します。
詳細説明:
指定されたモジュール名をimportlibモジュールを使用してインポートします。
一度インポートされたモジュールは内部のキャッシュに保存され、
次回以降の呼び出しではキャッシュから返されます。
インポートに失敗した場合、`stop_by_error` の値に応じてプログラムを終了するか、
警告メッセージを表示してNoneを返します。
:param module_name: インポートするモジュールの名前。(str)
:param stop_by_error: インポートエラー時にプログラムを終了するかどうか。Trueの場合、終了します。(bool, optional)
:returns: 成功した場合はインポートされたモジュールオブジェクト、失敗した場合はNone。(module or None)
"""
if module_name in imported_modules.keys():
return imported_modules[module_name]
try:
module = import_module(module_name)
imported_modules[module_name] = module
except Exception as e:
error_modules[module_name] = str(e)
if stop_by_error:
print()
print("###################################################################################")
print("###################################################################################")
print(f"Error: Failed to import [{module_name}] module ({e}).\n")
print(f" Install [{module_name}] using pip, pip3 or conda for anaconda. For exmaple,")
print(f" pip install {module_name}")
print("###################################################################################")
print("###################################################################################")
input( "\nPress ENTER to terminate>>\n\n")
exit()
else:
print(f"\nWarning: Failed to import [{module_name}] module ({e}).\n")
print( f"Functions included in [{module_name}] will not work\n")
return None
return module
[ドキュメント]
def messages(stop_by_error = True):
"""これまでのモジュールインポートで発生したエラーや警告メッセージを表示します。
詳細説明:
`import_lib` 関数によって記録されたインポートエラーのリストを、
コンソールに整形されたメッセージとして表示します。
`stop_by_error` の値に応じて、致命的なエラーとしてプログラムを終了するか、
単なる警告として処理を継続するかを決定します。
エラーメッセージには、pipなどでのインストール方法のヒントが含まれます。
:param stop_by_error: エラー時にプログラムを終了するかどうか。Trueの場合、終了し、Falseの場合、警告として継続します。(bool, optional)
:returns: エラーが発生しなかった場合はTrue、エラーが発生した場合はFalse。(bool)
"""
if len(error_modules) == 0:
return True
names = list(error_modules.keys())
print("###################################################################################")
print("###################################################################################")
if stop_by_error:
print(f"Fatal errors in previous imports:")
else:
print(f"Warnings in previous imports:")
for name, e in error_modules.items():
print(f" Failed to import [{name}] module ({e})")
print(f" Install the above modules using pip, pip3, or conda for anaconda. For exmaple:")
print(f" pip install {names[0]}")
if stop_by_error:
print("###################################################################################")
print("###################################################################################")
input( "\nPress ENTER to terminate>>\n\n")
exit()
else:
print("###################################################################################")
print("###################################################################################")
print()
return False