2013-05-11 26 views
2

我有套接字服务器设置运行一些unittests,它将输出其日志到控制台。如何禁用Python中的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

常用的技巧,以避免在Python控制台输出重定向它。 sys.stdout可以被任何打开的[写入]文本文件取代。

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) 
+0

我不喜欢这个,但我想它通过添加'sys.stdout的= open('/ dev/null','w')'setUp方法。根本没有改变输出。 – mlissner 2013-05-11 21:58:30

+0

难道是发送到控制台的输出有效来自写入stderr而不是stdout?尝试重定向stderr。 – mjv 2013-05-12 03:21:23

+0

重定向stderr的作品,但它是如此之多以至于我无法赞同它。如果测试失败,我将无法获得输出。这比成功过程中的输出更糟糕。 – mlissner 2013-05-17 19:09:54

0

在SocketServer中打印的唯一东西是handle_error()。如果您需要其他行为(如登录到日志记录服务或中止整个服务器以查找某些错误),则应该覆盖它。

+0

这是不对的,可以吗?该文档说:“如果RequestHandlerClass的handle()方法引发异常,则调用此函数。默认操作是将traceback打印到标准输出并继续处理其他请求。”这并没有提到有关SocketServer创建的常规输出的任何信息 - 它只提到堆栈跟踪。 – mlissner 2013-05-17 16:20:59

+0

我看了一下handle_error。这确实只适用于堆栈跟踪。 – mlissner 2013-05-17 19:10:16

+0

对不起,我一定错过了一些东西。我只看着源头,发现没有其他输出;也许它来自一个超类。 – 2013-05-18 14:29:41

4

打印输出不是来自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) 
+0

应该接受答案。不仅简单地工作,而且适当地做,没有黑客。 – omikron 2015-09-18 09:16:58