1. ホーム
  2. python

[解決済み] モジュールがインポートされているかどうかを確認するには?

2022-08-14 07:06:54

質問

コードのどこかでモジュールをインポートしたかどうかを確認するにはどうしたらよいでしょうか。

 if not has_imported("somemodule"):
     print('you have not imported somemodule')

モジュールをインポート済みかどうかを確認したい理由は、時々プログラムを混乱させるので、インポートしたくないモジュールがあるからです。

どのように解決するのですか?

のモジュール名をテストする。 sys.modules 辞書 :

import sys

modulename = 'datetime'
if modulename not in sys.modules:
    print 'You have not imported the {} module'.format(modulename)

ドキュメンテーションから

これは、モジュール名とすでにロードされているモジュールとを対応付ける辞書です。

なお import ステートメント は2つのことをします。

  1. モジュールが以前にインポートされたことがない場合 (== インポートされたことがない場合) sys.modules に存在しない) 場合は、ロードされ sys.modules .
  2. モジュール・オブジェクトを参照する、またはモジュール・ネームスペースのメンバーであるオブジェクトに、現在のネームスペースで1つ以上の名前をバインドします。

式は modulename not in sys.modules はステップ1が行われたかどうかをテストします。ステップ 2 の結果をテストするには、正確な import ステートメントが使用されたことを知る必要があります。

  • import modulename セット modulename = sys.modules['modulename']
  • import packagename.nestedmodule セット packagename = sys.modules['packagename'] (何段追加しても)
  • import modulename as altname セット altname = sys.module['modulename']
  • import packagename.nestedmodule as altname セット altname = sys.modules['packagename.nestedmodule']
  • from somemodule import objectname セット objectname = sys.modules['somemodule'].objectname
  • from packagename import nestedmodulename セット nestedmodulename = sys.modules['packagename.nestedmodulename'] (という名前のオブジェクトがないときのみ nestedmodulename の中に packagename という名前空間がある場合、ネストされたモジュールの追加の名前がこの時点で親パッケージの名前空間に追加されます)。
  • from somemodule import objectname as altname セット altname = sys.modules['somemodule'].objectname
  • from packagename import nestedmodulename as altname セット altname = sys.modules['packagename.nestedmodulename'] (という名前のオブジェクトがないときのみ nestedmodulename の中に packagename という名前空間がある場合、ネストされたモジュールの追加の名前がこの時点で親パッケージの名前空間に追加されます)。

インポートされたオブジェクトがバインドされた名前が、与えられた名前空間に存在するかどうかをテストすることができます。

# is this name visible in the current scope:
'importedname' in dir()

# or, is this a name in the globals of the current module:
'importedname' in globals()

# or, does the name exist in the namespace of another module:
'importedname' in globals(sys.modules['somemodule'])

これは名前が存在する(バインドされている)かどうかを教えてくれるだけで、 特定のモジュールやそのモジュールからのオブジェクトを参照しているかどうかはわかりません。さらにそのオブジェクトをイントロスペクトするか、それが sys.modules で利用可能なものと同じオブジェクトであるかどうかをテストできます。