__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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
    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,
        default="127.0.0.1",
        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,
96
        help='Do not run a server, only install plugin dependencies'
J. Fernando Sánchez's avatar
YAPFed    
J. Fernando Sánchez committed
97
    )
98
    args = parser.parse_args()
99
100
101
    logging.basicConfig()
    rl = logging.getLogger()
    rl.setLevel(getattr(logging, args.level))
102
103
    app = Flask(__name__)
    app.debug = args.debug
104
105
    if args.debug:
        sys.excepthook = info
106
    sp = Senpy(app, args.plugins_folder, default_plugins=args.default_plugins)
107
108
109
    if args.only_install:
        sp.install_deps()
        return
110
111
112
    sp.activate_all()
    http_server = WSGIServer((args.host, args.port), app)
    try:
113
114
        print('Senpy version {}'.format(senpy.__version__))
        print('Server running on port %s:%d. Ctrl+C to quit' % (args.host,
115
                                                                args.port))
116
117
        http_server.serve_forever()
    except KeyboardInterrupt:
118
        print('Bye!')
119
120
    http_server.stop()
    sp.deactivate_all()
J. Fernando Sánchez's avatar
J. Fernando Sánchez committed
121

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

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