我在游戏引擎中运行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关键字的工作方式做些什么?
答案 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'