1
2
3
4
5
6
7
8 import os, sys
9 from optparse import OptionParser
10
11 -def env(app, dir='', import_models=False):
12 import gluon.html as html
13 import gluon.validators as validators
14 from gluon.http import HTTP, redirect
15 from gluon.languages import translator
16 from gluon.cache import Cache
17 from gluon.globals import Request, Response, Session
18 from gluon.sql import SQLDB, SQLField
19 from gluon.sqlhtml import SQLFORM, SQLTABLE
20
21 request=Request()
22 response=Response()
23 session=Session()
24
25 if not dir:
26 request.folder = os.path.join('applications', app)
27 else:
28 request.folder = dir
29
30 environment={}
31 for key in html.__all__: environment[key]=eval('html.%s' % key)
32 for key in validators.__all__: environment[key]=eval('validators.%s' % key)
33 environment['T']=translator(request)
34 environment['HTTP']=HTTP
35 environment['redirect']=redirect
36 environment['request']=request
37 environment['response']=response
38 environment['session']=session
39 environment['cache']=Cache(request)
40 environment['SQLDB']=SQLDB
41 SQLDB._set_thread_folder(os.path.join(request.folder,'databases'))
42 environment['SQLField']=SQLField
43 environment['SQLFORM']=SQLFORM
44 environment['SQLTABLE']=SQLTABLE
45
46 if import_models:
47 model_path = os.path.join(request.folder,'models', '*.py')
48 from glob import glob
49 for f in glob(model_path):
50 fname, ext = os.path.splitext(f)
51 execfile(f, environment)
52
53
54 return environment
55
56 -def run(appname, plain=False, import_models=False, startfile=None):
57 from gluon.fileutils import untar
58
59 path=os.path.join('applications',appname)
60 if not os.access(path,os.F_OK):
61 if raw_input('application %s does not exit, create (y/n)?' % appname).lower() in ['y','yes']:
62 os.mkdir(path)
63 untar('welcome.tar',path)
64 else: return
65
66 _env = env(appname, import_models)
67
68 if startfile:
69 pythonrc = os.environ.get("PYTHONSTARTUP")
70 if pythonrc and os.path.isfile(pythonrc):
71 try:
72 execfile(pythonrc)
73 except NameError:
74 pass
75 execfile(startfile, {}, _env)
76 else:
77 if not plain:
78 try:
79 import IPython
80 shell = IPython.Shell.IPShell(argv=[], user_ns=_env)
81 shell.mainloop()
82 return
83 except:
84 print 'error: Import IPython error, please check you installed IPython'\
85 ' correctly, and use default python shell.'
86
87 import code
88 try:
89 import readline
90 except ImportError:
91 pass
92 else:
93 import rlcompleter
94 readline.set_completer(rlcompleter.Completer(_env).complete)
95 readline.parse_and_bind("tab:complete")
96
97 pythonrc = os.environ.get("PYTHONSTARTUP")
98 if pythonrc and os.path.isfile(pythonrc):
99 try:
100 execfile(pythonrc)
101 except NameError:
102 pass
103 code.interact(local=_env)
104
106 usage = """
107 %prog [options] pythonfile
108 """
109 return usage
110
112 if argv is None:
113 argv = sys.argv
114
115 parser = OptionParser(usage=get_usage())
116
117 parser.add_option('-S', '--shell',
118 dest='shell', metavar='APPNAME',
119 help='run web2py in interactive shell or IPython(if installed) with specified appname')
120 parser.add_option('-P', '--plain', action='store_true', default=False,
121 dest='plain',
122 help='only use plain python shell, should be used with --shell option')
123 parser.add_option('-M', '--import_models', action='store_true', default=False,
124 dest='import_models',
125 help='auto import model files, default is False, should be used with --shell option')
126 parser.add_option('-R', '--run', dest='run', metavar='PYTHON_FILE', default='',
127 help='run PYTHON_FILE in web2py environment, should be used with --shell option')
128
129 options, args = parser.parse_args(argv[1:])
130
131 if len(sys.argv) == 1:
132 parser.print_help()
133 sys.exit(0)
134
135 if len(args) > 0:
136 startfile = args[0]
137 else:
138 sstartfile = ''
139 run(options.shell, options.plain, startfile=startfile)
140
141 if __name__ == '__main__':
142 execute_from_command_line()
143