tklib.tkimport のソースコード

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