8

ロードされたモジュールとインポートされたモジュールの違いがあれば、それを理解しようとしています。

私は Python 2.7.3 で作業しており、コマンド ラインから Python を実行しています。

私が実行した場合:

import sys
sys.modules

osたとえば、を含むリストを取得します。ドキュメントにはsys.modules、「ロードされた」モジュールのリストであると書かれています。ただし、のようなものを実行しようとすると、定義されていないos.environことを示す NameErrorが表示されます。osただし、その後 を実行import osすると、問題は解決します。モジュールを実際にインポートする前に、なぜos存在するのか説明できますか?sys.modules

4

1 に答える 1

12

インポートされるモジュールとロードされるモジュールの違いは、現在のモジュールの名前空間に配置されるものです。モジュールは (通常の状況では) 1 回だけロードされますが、さまざまな場所から何度でもインポートできます。ロードされたモジュールは、そこにインポートされていない場合、特定の名前空間でアクセスできない場合があります。たとえば、from module import name構文を使用して、その名前でモジュールをインポートせずにモジュールをロードできます (指定された名前にアクセスできますが、モジュール自体にはアクセスできません)。

Python インタープリターによって内部的に使用されているため、辞書にosモジュールが表示されているため、起動時に常に読み込まれます。sys.modulesただし、名前空間に自動的にインポートされないため、「os」という名前を使用してアクセスすることはできません。

ただし、いくつかの方法で通常のインポート メカニズムをバイパスできます。たとえば、これを試してください:

import sys
os = sys.modules["os"]

os行った場合と同様に、モジュールにアクセスできるようになりますimport os

これは、そのコードが、import既にロードされているモジュールを要求したときにステートメントが行うこととまったく同じだからです。ただし、まだロードされていないモジュールで上記のコードを試すと、機能しません (sys.modules辞書からキー エラーが返されます)。このimportステートメントは、現在のネームスペースに追加するだけでなく、新しいモジュールをロードします。モジュールを手動でロードし、通常のインポート システムをさらに回避することはできますが、そうする正当な理由はほとんどありません。

于 2012-07-28T03:14:22.760 に答える