4

所以我有一个使用 py2app 捆绑到 .app 中的 python 应用程序。我有一些调试打印语句,如果我在终端中运行代码,通常会打印到标准输出。如果我只是打开捆绑的 .app,显然我看不到任何输出。即使我没有看到,这些内容是否真的被打印在某个地方?

4

3 回答 3

5

stdout 和 stderr 流重定向到的位置取决于您运行应用程序的方式以及您所在的 OSX 版本。

当您从终端(“MyApp.app/Contents/MacOS/MyApp”)运行应用程序时,输出最终会出现在终端窗口中。

当您通过双击或使用 open(1) 命令运行应用程序时,在使用 10.8 之前的 OSX 时,输出最终会出现在 Console.app 中,并且在 OSX 10.8 上会被丢弃。

我有一个补丁,可以将输出重定向到 Console.app 甚至对于 OSX 10.8 读取的日志,但目前还没有发布版本。

PS我是py2app的维护者。

于 2013-07-10T09:03:10.813 回答
3

它进入标准输出(如果您在命令行中打开它,那么在命令行中,或者如果您使用 cron 作业运行它,则进入日志)。

要获得更高级和更灵活的用法,请尝试使用内置的日志记录支持(logging模块)。它允许您将消息定向到控制台、文件、流(如外部日志服务器)、syslog进程、电子邮件等,以及基于日志消息级别的过滤器。调试语句(日志语句)仍然可以放在生产代码中,但配置为不会导致除错误之外的任何日志记录。非常有用并且大大简化了日志记录。

于 2013-07-09T16:16:31.323 回答
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
于 2013-07-09T16:19:50.593 回答