如何在 Python 中禁用 socketserver 的输出?

Posted

技术标签:

【中文标题】如何在 Python 中禁用 socketserver 的输出?【英文标题】:How can you disable the output of socketserver in Python? 【发布时间】:2013-05-06 06:55:48 【问题描述】:

我设置了 socketserver 来运行一些单元测试,并将其日志输出到控制台。

有没有办法禁用它?

这是我正在运行的大致代码:

class TestServer(SocketServer.TCPServer):
    allow_reuse_address = True


class ScraperExampleTest(unittest.TestCase):
    def setUp(self):
        # Due to requests not supporting the 'file' scheme, we are forced to run
        # our own server. See: https://github.com/kennethreitz/requests/issues/847
        Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
        httpd = TestServer(('', PORT), Handler)
        httpd_thread = threading.Thread(target=httpd.serve_forever)
        httpd_thread.setDaemon(True)
        httpd_thread.start()

【问题讨论】:

【参考方案1】:

打印输出不是来自 TCPServer 而是来自 SimpleHTTPRequestHandler,或者更准确地说是它的父级:BaseHTTPRequestHandler。您可以通过创建自己的处理程序和重载来更改行为:

def log_message(self, format, *args)

这样的事情应该可以工作:

class TestServer(SocketServer.TCPServer):
    allow_reuse_address = True 
    logging = False

class MyHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def log_message(self, format, *args):
        if self.server.logging:
            SimpleHTTPServer.SimpleHTTPRequestHandler.log_message(self, format, *args)

【讨论】:

应该接受这个答案。不仅简单有效,而且做得很好,没有黑客攻击。【参考方案2】:

在 Python 中避免控制台输出的一个常见技巧是重定向它。 sys.stdout 可以替换为任何打开的 [for writing] 文本文件。

import sys
f = open("myLog.txt", "w")
sto = sys.stdout
sys.stdout = f
#...

#... when done with tests

# restablish the orignal console output
sys.stdout = sto
fclose(f)

【讨论】:

我不喜欢这个,但我通过在 setUp 方法中添加 sys.stdout = open('/dev/null', 'w') 进行了尝试。根本没有改变输出。 发送到控制台的输出是否有效来自对标准错误的写入而不是标准输出?尝试重定向stderr。 重定向 stderr 是可行的,但我不能赞同它。如果测试失败,我将没有输出。这比成功期间输出过多更糟糕。

以上是关于如何在 Python 中禁用 socketserver 的输出?的主要内容,如果未能解决你的问题,请参考以下文章

在python中停止socketserver.ThreadingMixIn

Python SocketServer:发送到多个客户端?

使用 python socketserver 如何将变量传递给处理程序类的构造函数

Python使用socketServer包搭建简易服务器过程详解

Python之路 - Socketserver实现多并发

Python基础:网络编程socketserver高级篇