2016-05-05 12 views
1

私は正常に私のサーバ(ボトルフレームワークを使用して)をシャットダウンできるように、cntrl-cイベントをキャッチしようとしています。しかし、私はこれをテストするとき、私は決してデバッガで停止メソッドをヒットし、私はこれを確認するために閉鎖されていないソケット警告を取得します。私はここで何が欠けているのですか?SIGINTは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, lambda _signum, _stack: self.stop()) 
:代わりに

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

のないヘルパー関数を書きます

関連する問題