静默记录器和屏幕输出 - Python

13 投票
3 回答
13692 浏览
提问于 2025-04-15 21:24

我在使用我的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

撰写回答