切换python打印的最佳方法是什么?

时间:2009-04-02 11:49:10

标签: python printing

我在游戏引擎中运行Python 2.4,我希望能够在需要时关闭所有打印件。例如,我想打开调试版本的打印件,然后关闭发布版本。 它必须尽可能透明。

我在引擎的C代码中对此进行的解决方案是在printf宏中包含vararg函数,并定义在发布版本中不执行任何操作。

这是我目前的解决方案:

DebugPrints = True
def PRINT (*args):
    global DebugPrints
    if DebugPrints:
        string = ""
        for arg in args:
            string += " " + str(arg)
        print string

可以轻松切换打印输出,但可能有更好的格式化字符串的方法。我的主要问题是,这实际上是为程序添加了更多的函数调用。

我想知道你是否可以对print关键字的工作方式做些什么?

5 个答案:

答案 0 :(得分:12)

是的,您可以将sys.stdout分配给您想要的任何内容。使用write方法创建一个不做任何事情的小类:

class DevNull(object):
    def write(self, arg):
        pass

import sys    
sys.stdout = DevNull()
print "this goes to nirvana!"

使用相同的技术,您还可以通过将sys.stdout设置为打开的文件对象将打印件记录到文件中。

答案 1 :(得分:10)

我知道答案已被标记为正确,但Python有一个调试标志,可提供更清晰的解决方案。你这样使用它:

if __debug__:
    print "whoa"

如果使用-O或-OO调用Python(正如通常用于发布版本),__debug__将设置为False。更好的是__debug__是翻译的一个特例;它会在写入pyc/pyo文件时实际删除该代码,从而使得生成的代码更小/更快。请注意,您无法为__debug__分配值,因此它完全基于这些命令行参数。

答案 2 :(得分:9)

logging module是“最好”的方式..虽然我经常只是使用简单的东西......

class MyLogger:
    def _displayMessage(self, message, level = None):
        # This can be modified easily
        if level is not None:
            print "[%s] %s" % (level, message
        else:
            print "[default] %s" % (message)

    def debug(self, message):
        self._displayMessage(message, level = "debug")
    def info(self, message):
        self._displayMessage(message, level = "info")

log = MyLogger()
log.info("test")

答案 3 :(得分:3)

不要使用print,而是创建一个处理所有打印的控制台类。只需调用控制台,控制台就可以决定是否实际打印它们。控制台类对于错误和警告消息或重定向输出的位置也很有用。

答案 4 :(得分:0)

我已经different post回答了这个问题,但问题是重复的:

无论如何,这就是我要做的事情:

from __future__ import print_function
DebugPrints = 0

def print(*args, **kwargs):
    if DebugPrints:
        return __builtins__.print(*args, **kwargs)

print('foo') # doesn't get printed
DebugPrints = 1
print('bar') # gets printed

遗憾的是,您无法保留py2打印语法print 'foo'