2016-10-19 2 views
0

я написал TCP обработчик следующим образом (адаптировано из: https://docs.python.org/2/library/socketserver.html#socketserver-tcpserver-example):Python: каротаж и обработчик TCP

#!/usr/bin/env python 
# -*- coding: UTF-8 -*- 

import SocketServer 

from MyModule import myFunction 

class MyHandler(SocketServer.StreamRequestHandler): 

    def handle(self): 
     self.data = self.rfile.readline().strip() 
     result = myFunction(self.data) 
     self.wfile.write(result) 

if __name__ == "__main__": 
    HOST, PORT = myhost, myport 
    server = SocketServer.TCPServer((HOST, PORT), MyHandler) 
    server.serve_forever() 

Он отлично работает, и теперь я пытаюсь добавить регистратор:

#!/usr/bin/env python 
# -*- coding: UTF-8 -*- 

import SocketServer 
import logging 
from logging.handlers import TimedRotatingFileHandler 

from MyModule import myFunction 

class MyHandler(SocketServer.StreamRequestHandler): 

    def __init__(self): 
     self.logger = logging.getLogger() 
     self.logger.setLevel(logging.DEBUG) 
     self.formatter = logging.Formatter('%(asctime)s :: %(levelname)s :: %(message)s') 
     self.file_handler = TimedRotatingFileHandler('my_log_file.log', when='D', interval=1, utc=True) 
     self.file_handler.setLevel(logging.DEBUG) 
     self.file_handler.setFormatter(self.formatter) 
     self.logger.addHandler(self.file_handler) 

    def handle(self): 
     self.data = self.rfile.readline().strip() 
     result = myFunction(self.data) 
     self.wfile.write(result) 

     self.logger.info(result) 

if __name__ == "__main__": 
    HOST, PORT = myhost, myport 
    server = SocketServer.TCPServer((HOST, PORT), MyHandler) 
    server.serve_forever() 

Когда я запускаю его я получаю следующее сообщение об ошибке:

TypeError: __init__() takes exactly 1 argument (4 given)

Я не понимаю, что такое 4 аргумента. Есть ли что-то не так с кодом, кроме этого?

EDIT: Полный TraceBack:

Exception happened during processing of request from ('MyIP', 54028) 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/SocketServer.py", line 290, in _handle_request_noblock 
    self.process_request(request, client_address) 
    File "/usr/lib/python2.7/SocketServer.py", line 318, in process_request 
    self.finish_request(request, client_address) 
    File "/usr/lib/python2.7/SocketServer.py", line 331, in finish_request 
    self.RequestHandlerClass(request, client_address, self) 
TypeError: __init__() takes exactly 1 argument (4 given) 
+0

просьба предоставить полную обратную трассировку. Кроме того, вы пропустили «я». перед logger.info (результат) – MateuszL

+0

@MateuszL Я добавил полный backtrace и «я». – EliseB

ответ

2

MyHandler подкласс SocketServer.StreamRequestHandler, который является подклассом BaseRequestHandler. call signature of BaseRequestHandler.__init__ является

def __init__(self, request, client_address, server): 

сообщение об ошибке отслеживающий показывает, что внутри BaseServer.finish_request method

self.RequestHandlerClass(request, client_address, self) 

называется. self.RequestHandlerClass есть MyHandler. Поэтому MyHandler.__init__ должен иметь подпись позвонить

class MyHandler(SocketServer.StreamRequestHandler): 
    def __init__(self, request, client_address, server): 

вместо

class MyHandler(SocketServer.StreamRequestHandler): 
    def __init__(self): 

Когда self.RequestHandlerClass(request, client_address, self) называется, Python называет в RequestHandlerClass метод с self в качестве первого аргумента. Другими словами, вызывается RequestHandlerClass(self, request, client_address, self). self, request, client_address, self - это четыре аргумента, которые передаются MyHandler. Сообщение об ошибке

TypeError: __init__() takes exactly 1 argument (4 given) 

жалуется, что MyHandler.__init__ было определено ожидать только один аргумент, и все же это было передается 4 аргумента.

+0

Хорошая точка, я, сам .... – dsgdfg

Смежные вопросы