2016-05-05 4 views
1

Я пытаюсь поймать cntrl-c события, чтобы я мог изящно завершить работу моего сервера (используя флэш-рамки). Однако, когда я проверяю это, я никогда не ударяю метод stop в отладчике, и я также получаю предупреждение о закрытом гнезде, чтобы подтвердить это. Что мне здесь не хватает.SIGINT not captureble, in python

class CFMServer(ServerAdapter): 

    def run(self, handler): 
     from wsgiref.simple_server import make_server, WSGIRequestHandler 
     self.server = make_server(self.host, self.port, handler, **self.options) 
     # set signal handlers 
     signal.signal(signal.SIGINT, self.stop) 
     signal.signal(signal.SIGTERM, self.stop) 
     try: 
      self.server.serve_forever() 
     except KeyboardInterrupt: 
      self.stop() 
      raise 

    def stop(self): 
     pdb.set_trace() 
     manager.save() 
     self.server.server_close() 


if __name__ == "__main__": 
    parser = argparse.ArgumentParser() 
    parser.add_argument('port', metavar='P', type=int, 
         help='Port to assign the server in localhost') 
    args = parser.parse_args() 
    port = args.port 
    server = CFMServer(host='localhost', port=port) 
    service.run(server=server, debug=True) 

Вот мой вывод из оболочки, когда я прерываю.

Bottle v0.13-dev server starting up (using CFMServer())... 
Listening on http://localhost:11245/ 
Hit Ctrl-C to quit. 

^CTraceback (most recent call last): 
    File "./cfm-service", line 127, in <module> 
    service.run(server=server, debug=True) 
    File "/repo/ekrmann/next-debugger/python/emca/gdbcmds/emca/core/third_party/bottle.py", line 881, in run 
    run(self, **kwargs) 
    File "/repo/ekrmann/next-debugger/python/emca/gdbcmds/emca/core/third_party/bottle.py", line 3476, in run 
    server.run(app) 
    File "./cfm-service", line 108, in run 
    self.server.serve_forever() 
    File "/app/vbuild/RHEL6-i686/python/3.5.0/lib/python3.5/socketserver.py", line 237, in serve_forever 
    ready = selector.select(poll_interval) 
    File "/app/vbuild/RHEL6-i686/python/3.5.0/lib/python3.5/selectors.py", line 367, in select 
    fd_event_list = self._poll.poll(timeout) 
TypeError: stop() takes 1 positional argument but 3 were given 
sys:1: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 11245)> 

ответ

0

Ваш метод stop не реализует подпись обработчика сигнала Python. Вместо

signal.signal(signal.SIGINT, self.stop) 

написать вспомогательную функцию, которая делает:

signal.signal(signal.SIGINT, lambda _signum, _stack: self.stop()) 

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

  • Нет связанных вопросов^_^