静默记录器和屏幕输出 - Python
我在使用我的Python脚本时遇到了一个问题。
它在屏幕上打印了大量的数据,我想要阻止所有这些输出。
编辑:
我使用的库是mechanize,它在屏幕上打印了很多数据。
我已经把这些设置为false,但还是没有效果!
br.set_debug_redirects(False)
br.set_debug_responses(False)
br.set_debug_http(False)
有没有什么好的主意?
如果能帮忙就太好了,非常感谢!
3 个回答
0
你也可以使用 StringIO
模块,而不是自己去创建一个输出流。因为有时候,输出流不仅仅需要一个 write
方法(flush
也是常用的一个方法),而 StringIO
可以处理这些情况。
import StringIO
import sys
sys.stdout = StringIO.StringIO()
2
你可以把系统的标准输出(sys.stdout)和标准错误输出(sys.stderr)重定向到一个文件,或者任何你自己创建的类似文件的对象,比如:
class EatLog(object):
def write(self):
pass
sys.stdout = EatLog()
不过我不太推荐这样做,更简单的办法是使用操作系统级别的重定向,比如:
python myscript.py > out.log
17
(根据你的第二次编辑)
如果你不想关闭所有的输出,可以尝试只针对 mechanize
这个库进行设置。这个链接 http://wwwsearch.sourceforge.net/mechanize/ 提供了一段代码,我稍微修改了一下(虽然我不确定它是否有效):
import logging
logger = logging.getLogger("mechanize")
# only log really bad events
logger.setLevel(logging.ERROR)
当你打印东西时,它会通过 sys.stdout
这个文件显示在屏幕上。你可以把这个文件换成其他文件(比如你打开的日志文件),这样就不会在屏幕上打印任何内容了:
import sys
# save the old stdout so you can print later (do sys.stdout = OLD_STDOUT)
OLD_STDOUT = sys.stdout
sys.stdout = open("logfile.txt", 'w')
当然,如果你在使用某个库,它可能会打印到 sys.stderr
。幸运的是,你也可以对这个进行同样的处理(接着上面的内容):
OLD_STDERR = sys.stderr
sys.stderr = open("errorLog.txt", 'w')
现在,如果因为某种原因你想完全忽略 stdout(或 stderr),再也不想看到它们,你可以定义自己的类,这些类就像文件一样,但会直接丢弃内容:
class Discarder(object):
def write(self, text):
pass # do nothing
# now discard everything coming out of stdout
sys.stdout = Discarder()
另外,提供一个在 Unix shell 中有效的解决方案:
# discards all input (change /dev/null to a file name to keep track of output)
python yourScript.py > /dev/null