2013-07-09 47 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的维护者。

相关问题