2013-07-09 48 views
2

所以我有一個python應用程序被捆綁到一個.app使用py2app。我在那裏有一些調試打印語句,如果我在終端中運行代碼,通常會打印到標準輸出。如果我打開捆綁的.app,顯然我沒有看到任何這種輸出。即使我沒有看到它,是否有任何這個實際打印的地方?從終端不運行應用程序時,「打印」到哪裏?

+1

你或許應該使用Python的'logging'模塊開始的,但你有沒有試過在尋找Console.app? – geoffspear

+1

是的,我認爲它可能在那裏,但我沒有看到它。記錄模塊是否使它顯示在console.app中? – vik

回答

3

它到標準輸出(所以在命令行,如果你是在命令行,或如打開它。到日誌中,如果您正在使用cron作業運行它)。

對於更先進,更靈活的使用嘗試使用內置的日誌支持(logging module)。它允許您將消息定向到控制檯,文件,流(如外部日誌記錄服務器),進程,電子郵件等,以及基於日誌消息級別的過濾器。調試語句(日誌語句)然後可以放置在生產代碼中,但配置爲不會導致除錯誤以外的任何日誌記錄。非常有用並簡化了很多日誌記錄。

+0

不錯,這似乎更多的是我所需要的。是否有可能使用日誌記錄模塊將事件輸出到標準輸出以及日誌中,這樣,如果我在終端中運行某些內容,我只會看到終端中的輸出? – vik

+0

@vik:是的,可以爲任何記錄器提供幾個處理程序。此外,您可以創建非常複雜的日誌記錄結構(分層記錄器,每個記錄器都有傳播或不傳播,不同的處理程序,過濾器和格式化程序)。 Python日誌記錄實際上是一個解決方案,成爲其他一些更新解決方案(如Symfony的Monolog)的基礎。 – Tadeck

0

我想你可能想看一看命名模塊logging

可以比使用此模塊安裝到您自己的日誌記錄到一個單獨的文件,例如,這就是我如何做到這一點:

import logging 

# Create a log file for the future debug 
LOG_FILE_NAME = 'my-script.log' 
log_path = path = os.path.join(os.path.expanduser('~'), '/mnt/logs/') 
if not os.path.exists(log_path): 
    os.makedirs(log_path) 
logger = logging.getLogger('my-script') 
logger.setLevel(logging.DEBUG) 
file_handler = logging.FileHandler(log_path+LOG_FILE_NAME) 
file_handler.setLevel(logging.DEBUG) 
file_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(message)s') 
file_handler.setFormatter(file_formatter) 
logger.addHandler(file_handler) 

class Foo() 

    def log(self, msg, level=None): 
     print "LOG %s" % msg 
     if level is not None: 
      if level == 'INFO': 
       logger.info(msg) 
      elif level == 'WARNING': 
       logger.warn(msg) 
      elif level == 'ERROR': 
       logger.error(msg) 
      elif level == 'CRITICAL': 
       logger.critical(msg) 
     else: 
      logger.debug(msg) # DEBUG 

    self.log('Some text here', 'DEBUG') # I use self.log instead of print 
+2

兩件事:1)爲什麼你堅持壓倒標準的採伐行爲?它看起來像這種方法不給你任何優勢? 2)這種方法使得任何日誌配置被覆蓋,而更好的方法是隻給予標準處理程序(空/無操作處理程序)並在其他地方處理日誌配置(例如,看看Django的日誌記錄配置)。 – Tadeck

+0

所以這將打印味精輸出到標準輸出以及記錄? – vik

+0

是的,它會打印它,如果你在終端中運行,並將它們寫入日誌文件。 – Vor

2

stdout和stderr流重定向到哪裏取決於您如何運行應用程序以及您在哪個OSX版本上。

當運行從終端(「MyApp.app/Contents/MacOS/MyApp」)的應用程序的輸出在終端窗口結束。

當運行通過雙擊,或者使用開放(1)命令的應用中,輸出使用OSX當Console.app結束之前10.8並被丟棄在OSX 10.8。

我有一個重定向輸出到Console.app甚至OSX 10.8讀取日誌補丁,但不是在發佈的版本在這個時間點。

P.S.我是py2app的維護者。

相關問題