2010-12-14 82 views
3

有沒有更好的方式只能在腳本運行時打印,__name__ == '__main__'僅在以腳本運行時纔打印?

我有一些腳本,我也導入和使用的一部分。下面

喜歡的東西的工作,但是醜陋的,並會在單獨每個腳本中定義:

def printif(s): 
    if globals()['__name__'] == '__main__': 
     print (s) 
    return 

我在一些Python的日誌庫的擡頭看了一眼,但我們更希望兩個輕量級的解決方案.. 。

編輯:

最後我做這樣的事情:

# mylog.py 
import sys 
import logging 

log = logging.getLogger() 

#default logging level 
log.setLevel(logging.WARNING) 

log.addHandler(logging.StreamHandler(sys.stdout)) 

而且從腳本:

import log from mylog 

... 
log.info(...) 
log.warning(...) 
... 

if __name__ == '__main__': 
    #override when script is run.. 
    log.setLevel(logger.INFO) 

該方案具有最小的代碼重複,每個腳本日誌級別和項目範圍內的默認級別......這正是我想要的。

回答

0

使用日誌庫是真的不重量級:

import logging 

log = logging.getLogger('myscript') 

def dostuff(...): 
    .... 
    log.info('message!') 
    ... 

if __name__ == '__main__': 
    import sys 
    log.setLevel(logging.INFO) 
    log.addHandler(logging.StreamHandler(sys.stdout)) 
    ... 

一個疣是「警告:沒有發現的MyScript處理程序」的消息,在默認情況記錄打印,如果你把這個模塊(而不是將其作爲腳本運行),並在不設置日誌記錄的情況下調用您的函數。 Python 3.2中的It'll be gone。對於Python 2.7,你可以通過在頂部添加

log.addHandler(logging.NullHandler()) 

關閉它,併爲老版本,你不得不define a NullHandler class這樣的:

class NullHandler(logging.Handler): 
    def emit(self, record): 
     pass  

這一切回想起來,我說:跟着傑拉特的建議。爲了完整起見,我會離開這裏。

+0

我正在使用此變體。在python中簡單的日誌記錄是輕量級的(鍋爐,語法)。 – user318904 2010-12-14 19:49:49

5
run_as_script = False 

def printif(s): 
    if run_as_script: 
     print (s) 
    return 

if __name__ == '__main__': 
    run_as_script = True 
+0

這僅僅是別名-ING __name__ == __main__,並且等同於我張貼以上的代碼。如果這是在另一個模塊中定義並導入的,則它的行爲不如預期。 – user318904 2010-12-14 17:38:52

1

根據user318904對我的其他答案的評論,我會提供一個替代方案(儘管這可能不適用於所有情況,它可能只是「足夠好」)。
對於一個單獨的模塊:

import sys 

def printif(s): 
    if sys.argv[0] != '': 
     print (s) 
+0

再一次,基本上是一樣的。 – user318904 2010-12-14 19:52:21

+0

你試過了嗎? – Gerrat 2010-12-14 19:59:33

+0

是的,你是對的,這是行不通的。我很倉促地解僱它。我仍然會選擇日誌包的更多功能,但我會將其添加到我的實用函數..謝謝! – user318904 2010-12-15 18:04:31

相關問題