__main__.py 3.64 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
#!/usr/bin/python
# -*- coding: utf-8 -*-
#    Copyright 2014 J. Fernando Sánchez Rada - Grupo de Sistemas Inteligentes
#                                                       DIT, UPM
#
#    Licensed under the Apache License, Version 2.0 (the "License");
#    you may not use this file except in compliance with the License.
#    You may obtain a copy of the License at
#
#        http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS,
#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#    See the License for the specific language governing permissions and
#    limitations under the License.
"""
Senpy is a modular sentiment analysis server. This script runs an instance of
the server.

"""
22

23
from flask import Flask
24
from senpy.extensions import Senpy
25 26
from gevent.wsgi import WSGIServer
from gevent.monkey import patch_all
27 28
import logging
import os
29
import sys
30
import argparse
31
import senpy
32

33 34
patch_all(thread=False)

J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
35 36
SERVER_PORT = os.environ.get("PORT", 5000)

J. Fernando Sánchez's avatar
YAPFed  
J. Fernando Sánchez committed
37

38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
def info(type, value, tb):
    if hasattr(sys, 'ps1') or not sys.stderr.isatty():
        #  we are in interactive mode or we don't have a tty-like
        #  device, so we call the default hook
        sys.__excepthook__(type, value, tb)
    else:
        import traceback
        import pdb
        # we are NOT in interactive mode, print the exception...
        traceback.print_exception(type, value, tb)
        print
        # ...then start the debugger in post-mortem mode.
        # pdb.pm() # deprecated
        pdb.post_mortem(tb)  # more "modern"


J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
54
def main():
55
    parser = argparse.ArgumentParser(description='Run a Senpy server')
J. Fernando Sánchez's avatar
YAPFed  
J. Fernando Sánchez committed
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
    parser.add_argument(
        '--level',
        '-l',
        metavar='logging_level',
        type=str,
        default="INFO",
        help='Logging level')
    parser.add_argument(
        '--debug',
        '-d',
        action='store_true',
        default=False,
        help='Run the application in debug mode')
    parser.add_argument(
        '--default-plugins',
        action='store_true',
        default=False,
        help='Load the default plugins')
    parser.add_argument(
        '--host',
        type=str,
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
77
        default="0.0.0.0",
J. Fernando Sánchez's avatar
YAPFed  
J. Fernando Sánchez committed
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
        help='Use 0.0.0.0 to accept requests from any host.')
    parser.add_argument(
        '--port',
        '-p',
        type=int,
        default=SERVER_PORT,
        help='Port to listen on.')
    parser.add_argument(
        '--plugins-folder',
        '-f',
        type=str,
        default='plugins',
        help='Where to look for plugins.')
    parser.add_argument(
        '--only-install',
        '-i',
        action='store_true',
        default=False,
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
96
        help='Do not run a server, only install plugin dependencies')
97
    args = parser.parse_args()
98 99 100
    logging.basicConfig()
    rl = logging.getLogger()
    rl.setLevel(getattr(logging, args.level))
101 102
    app = Flask(__name__)
    app.debug = args.debug
103 104
    if args.debug:
        sys.excepthook = info
105
    sp = Senpy(app, args.plugins_folder, default_plugins=args.default_plugins)
106 107 108
    if args.only_install:
        sp.install_deps()
        return
109 110 111
    sp.activate_all()
    http_server = WSGIServer((args.host, args.port), app)
    try:
112 113
        print('Senpy version {}'.format(senpy.__version__))
        print('Server running on port %s:%d. Ctrl+C to quit' % (args.host,
114
                                                                args.port))
115 116
        http_server.serve_forever()
    except KeyboardInterrupt:
117
        print('Bye!')
118 119
    http_server.stop()
    sp.deactivate_all()
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
120

J. Fernando Sánchez's avatar
YAPFed  
J. Fernando Sánchez committed
121

J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
122 123
if __name__ == '__main__':
    main()