2015-06-23 20 views
0

正確初始化導入模塊我有一個文件test.py可以用Python

import logging 

def func(): 
    logger.info('some info') 

if __name__ == '__main__': 
    logger = logging.getLogger() 
    func() 

其中運行良好。當我從另一個文件中測試導入func並調用func()方法時,它會給我帶來global name 'logger' is not defined錯誤。

from test import func 
def another_fun(): 
    func() 

即使我把another_func()logger = logging.getLogger()調用func()之前,它仍然給了我這樣的錯誤。我想知道在這種情況下,通過適當的初始化從其他文件導入函數的標準方式是什麼。非常感謝。

+0

我認爲'func()'不能識別'logger'作爲一個全局變量,因爲你沒有告訴它這麼做。你有沒有嘗試之前添加一個'全球記錄器'行?看看這個:http://stackoverflow.com/questions/423379/using-global-variables-in-a-function-other-than-the-one-that-c​​reated-them – tomasyany

+0

這是因爲你定義'記錄器'在'main'部分,所以它永遠不會被導入。 –

回答

0
#!/usr/bin/env python3 
import logging 
logger = logging.getLogger("funclogger") # all modules importing this get access to funclogger log object 

def func():  
    logger.info('some info') 

if __name__ == '__main__': 
    func() 

其他過程調用another_func()

#!/usr/bin/env python3 
import logging 
logger = logging.getLogger("funclogger") # May not be needed if this module doesn't log 
from test import func 

def another_fun(): 
    func() 

這就像@Kevin提及。

another_fun()調用test.py的方法,但因爲當你運行它作爲一個腳本(這是__main__部分)您logger變量只初始化,當func()被調用,因此不能識別變量它不是初始化。這也意味着當another_fun()調用func()時,由於another_fun()不是在您的test.py模塊中調用__main__,因此未找到記錄器對象。

+0

是的,我沒有導入日誌。而且我確實在getLogger()中放了name參數,對不起,我爲了簡單起見在這裏省略了它。現在我把記錄器初始化放在func()下,但它仍然給我「NameError:全局名稱'記錄器'未定義」。我不明白爲什麼我應該用兩種方法。 –

+0

如果出現競爭條件,或者其他模塊導入了您的模塊,但其他模塊中定義了重要對象。基本上它有助於涉及線程或多處理,並且是最佳實踐。這不是必需的,但建議。 如果記錄器沒有定義,那麼它似乎你的記錄器對象沒有被初始化或超出範圍 – NuclearPeon

+0

我也沒有得到任何錯誤,當我運行你的代碼,複製粘貼,使可執行文件,幷包括一個hashbang。你在linux上運行,你如何執行你的腳本? 編輯:更正:找到你的錯誤 – NuclearPeon

0

不要在if __name__ == '__main__'中初始化東西。這是爲了在您的文件作爲腳本執行時運行的代碼。理想情況下,它應該包含一個函數調用,而不是其他任何東西。

您也無法在其他模塊中定義全局變量。每個模塊都有自己的一組獨立的全局變量。您必須在test.py模塊中初始化logger

+0

如果我只是想從該模塊導入一個函數,我該如何初始化該變量?把它們放在函數定義之前? –