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

2024-09-29 02:17:32 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

这是我目前的解决方案:

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

这使得切换打印输出变得很容易,但是可能有更好的方式来格式化字符串。我的主要问题是这实际上是在给程序添加更多的函数调用。在

我想知道有没有什么你可以做的打印关键字如何工作?在


Tags: 函数代码引擎版本true游戏string定义
3条回答

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")

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

if __debug__:
    print "whoa"

如果使用-O或-OO调用Python(就像通常在发布版本中一样),__debug__被设置为False。更好的是__debug__是解释器的一个特殊情况;当它编写pyc/pyo文件时,它实际上会去掉这些代码,使生成的代码更小/更快。请注意,您不能为__debug__赋值,因此它完全基于这些命令行参数。在

是的,您可以将sys.stdout分配给任何您想要的。使用一个不执行任何操作的write方法创建一个小类:

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

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

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

相关问题 更多 >