2009-07-11 37 views
1

好的,所以我知道from-importimport「完全相同」,但顯然不是因爲名稱空間的填充不同。「從進口」執行整個模塊嗎?

我的問題是主要動機,因爲我有一個utils模塊,具有了在我的應用程序使用的所有其他模塊的一個或兩個功能,並且據我工作納入標準庫logging模塊,我可以告訴我需要做的幾分像這樣:

import logging 
logging.basicConfig(filename="/var/log") # I want file logging 

baselogger = logging.getLogger("mine") 
#do some customizations to baselogger 

,然後在不同的模塊使用它,我會再次導入日誌:

import logging 
logger = logging.getlogger("mine") 

# log stuff 

但我想知道的是,如果我做了from utils import awesome_func將會確定我的記錄器,並且將按照我的需要設置記錄模塊?

這也適用於其他通用設置。

回答

5

看起來像答案是肯定的:

$ echo 'print "test" 
def f1(): 
    print "f1" 

def f2(): 
    print "f2" 

' > util.py 

$ echo 'from util import f1 
f1() 
from util import f2 
f2() 
' > test.py 

$ python test.py 
test 
f1 
f2 

$ 
+0

謝謝。用一個非常小的測試日誌記錄模塊進行更具體的操作,表明它可以正確初始化。 – quodlibetor 2009-07-12 19:24:10

1

是的,from MODULE import OBJECT執行模塊中的所有內容,然後有效地執行OBJECT = MODULE.OBJECT。從某種意義上說,您可以知道該模塊已被加載,因爲它現在位於sys.modules字典中。

6

的回答你的問題是肯定的。

有關導入過程的很好解釋,請參閱Frederik Lundh的「Importing Python Modules」。

特別是,我會引用回答您的查詢的部分。

Python會如何導入模塊?

[...]

  1. 創建一個新的,空的模塊對象(這基本上是一個字典)
  2. 插入在字典sys.modules
  3. 加載模塊代碼模塊對象對象(如有必要,先編譯模塊)
  4. 在新模塊的名稱空間中執行模塊代碼對象。代碼分配的所有變量將通過模塊對象提供。

和使用from-import

有很多方法導入模塊

[...]

從X導入, b,c導入模塊X,並在當前命名空間中爲給定對象創建引用。換句話說,你現在可以在你的程序中使用a和b和c。

注意我已經忽略了一些問題。這是值得閱讀整個文件,它實際上很短。

+0

謝謝,在我問我的問題之前,我確實已經閱讀過這篇文章,但是我不覺得「從X導入a,b,c」部分是完全清楚的。因爲它不像上面的部分那樣導入模塊。但是,基於所提供的所有其他證據,這當然足夠接近。 – quodlibetor 2009-07-12 19:23:06

0

如上所述,是的。 ,你可以寫簡單的測試,以確保:怎麼有的進口或子類或thomething別的辦法

# file m.py 
import sys 

# define function 
def f(): 
    pass 

#execute this when module is loaded (i.e. imported or run as script) 
print 'imported', __name__ 
# print all "exposed" variables to make sure that the f is visible 
print dir(sys.modules[__name__]) 

# file main.py 
from m import f 
print 'done' 

我建議在每懷疑你的時間來寫這樣的測試。