2012-07-28 10 views
8

ロードされたモジュールとインポートされたモジュールの違いを理解しようとしています。Python sys.modulesにはまだインポートされていないモジュールが含まれています

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

私は実行する場合:

import sys 
sys.modules 

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

+0

新しいシェルを開き、手順を実行します。説明を投稿するか、スクリーンショットを作成することをお勧めします。モジュールosはsysに存在しません。 –

答えて

9

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

osモジュールはsys.modulesディクショナリにあります。ディクソンはPythonインタプリタによって内部的に使用されているため、常に起動時に読み込まれるためです。ただし、名前空間に自動的にインポートされないため、 "os"という名前でアクセスすることはできません。

ただし、通常のインポートメカニズムをいくつかの方法で回避することができます。例えば、これを試してみてください。

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

あなたは今、あなたはimport osを行っていたかのようにosモジュールにアクセスできるようになります。

これは、すでにロードされているモジュールをリクエストするときに、そのコードが正確にimport文が実行するためです。しかし、まだロードされていないモジュールで上記のコードを試しても、動作しません(sys.modules辞書からキーエラーが発生します)。 importステートメントは、現在の名前空間に追加するだけでなく、新しいモジュールを読み込みます。手動でモジュールを読み込んで通常のインポートシステムをさらに処理することはできますが、そのような理由はまれです。

+0

ありがとうございました。 – Justin

関連する問題