2012-07-28 21 views
8

我想了解一個加載的模塊與導入的模塊之間的區別,如果有的話。Python sys.modules包含一個尚未導入的模塊

我正在使用Python 2.7.3,並且只是從命令行運行Python。

如果我執行:

import sys 
sys.modules 

我得到一個名單,其中包括os,例如。該文檔說sys.modules是「已加載」模塊的列表。但是,如果我嘗試運行諸如os.environ之類的東西,則會得到一個NameError,它告訴我os未定義。但是,如果我運行import os,則可以解決此問題。任何人都可以解釋爲什麼os存在於sys.modules實際導入模塊之前?

+0

打開一個全新的外殼,並通過步驟。發佈說明或更好的屏幕截圖。模塊os不駐留在sys中。 – 2012-07-28 02:27:10

回答

9

正在導入和正在加載的模塊之間的區別是放入當前模塊的名稱空間中。一個模塊只能加載一次(在一般情況下),但可以從許多不同的地方多次導入。如果已加載的模塊尚未導入,那麼在給定的名稱空間中可能無法訪問該模塊。例如,您可以使用from module import name語法加載模塊而不用名稱導入它(您可以訪問指定的名稱,但不能訪問模塊本身)。

您看到sys.modules字典中的os模塊,因爲它由Python解釋器在內部使用,因此它始終在啓動時加載。儘管你不能使用名字「os」來訪問它,因爲它不會自動導入你的名字空間。

但是,您可以通過幾種方式繞過正常的導入機制。例如,試試這個:

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

現在,您就可以訪問os模塊就好像你做了import os

這是因爲當您請求已加載的模塊時,該代碼正是import語句所執行的操作。但是,如果您嘗試使用尚未加載的模塊的上述代碼,則該代碼無效(您將從sys.modules字典中收到關鍵錯誤)。除了將它們添加到當前名稱空間之外,import語句還加載新模塊。雖然您可以手動加載模塊並進一步解決常規導入系統問題,但很少有充分理由這樣做。

+0

謝謝,這幫了很大的忙! – Justin 2012-07-28 09:02:23