所以我有一个使用py2app捆绑到.app的python应用程序。我在那里有一些调试打印语句,如果我在终端中运行代码,通常会打印到stdout。如果我只是打开捆绑的.app,显然我没有看到任何这个输出。即使我没有看到它,这些是否真的被打印在某处?
答案 0 :(得分:3)
它转到标准输出(因此在命令行中,如果您在命令行中打开它,或者例如在日志中打开它,如果您使用cron作业运行它)。
要获得更高级和灵活的使用,请尝试使用内置日志记录支持(logging
module)。它允许您将消息定向到控制台,文件,流(如外部日志服务器),syslog
进程,电子邮件等,以及基于日志消息级别的过滤。然后,调试语句(日志语句)仍然可以放在生产代码中,但配置为不会导致除错误之外的任何日志记录。非常有用并简化了很多日志记录。
答案 1 :(得分:2)
stdout和stderr流重定向的位置取决于您运行应用程序的方式,以及您在哪个OSX版本上的运行。
当您从终端运行应用程序时(" MyApp.app/Contents/MacOS/MyApp"),输出将在终端窗口中结束。
当您通过双击或使用open(1)命令运行应用程序时,在10.8之前使用OSX时输出将在Console.app中结束,并在OSX 10.8上被丢弃。
我有一个补丁,可以将输出重定向到Console.app甚至为OSX 10.8读取的日志,但此时此版本尚未发布。
P.S。我是py2app的维护者。
答案 2 :(得分: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