main.py (6171:59006a759508) main.py (6654:4c84e771cca7)
1# Copyright (c) 2005 The Regents of The University of Michigan
2# All rights reserved.
3#
4# Redistribution and use in source and binary forms, with or without
5# modification, are permitted provided that the following conditions are
6# met: redistributions of source code must retain the above copyright
7# notice, this list of conditions and the following disclaimer;
8# redistributions in binary form must reproduce the above copyright
9# notice, this list of conditions and the following disclaimer in the
10# documentation and/or other materials provided with the distribution;
11# neither the name of the copyright holders nor the names of its
12# contributors may be used to endorse or promote products derived from
13# this software without specific prior written permission.
14#
15# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26#
27# Authors: Nathan Binkert
28
29import code
30import datetime
31import os
32import socket
33import sys
34
1# Copyright (c) 2005 The Regents of The University of Michigan
2# All rights reserved.
3#
4# Redistribution and use in source and binary forms, with or without
5# modification, are permitted provided that the following conditions are
6# met: redistributions of source code must retain the above copyright
7# notice, this list of conditions and the following disclaimer;
8# redistributions in binary form must reproduce the above copyright
9# notice, this list of conditions and the following disclaimer in the
10# documentation and/or other materials provided with the distribution;
11# neither the name of the copyright holders nor the names of its
12# contributors may be used to endorse or promote products derived from
13# this software without specific prior written permission.
14#
15# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26#
27# Authors: Nathan Binkert
28
29import code
30import datetime
31import os
32import socket
33import sys
34
35from util import attrdict
35from util import attrdict, fatal
36import config
37from options import OptionParser
38
39__all__ = [ 'options', 'arguments', 'main' ]
40
41usage="%prog [m5 options] script.py [script options]"
42version="%prog 2.0"
43brief_copyright='''
44Copyright (c) 2001-2008
45The Regents of The University of Michigan
46All Rights Reserved
47'''
48
49options = OptionParser(usage=usage, version=version,
50 description=brief_copyright)
51add_option = options.add_option
52set_group = options.set_group
53usage = options.usage
54
55# Help options
56add_option('-A', "--authors", action="store_true", default=False,
57 help="Show author information")
58add_option('-B', "--build-info", action="store_true", default=False,
59 help="Show build information")
60add_option('-C', "--copyright", action="store_true", default=False,
61 help="Show full copyright information")
62add_option('-R', "--readme", action="store_true", default=False,
63 help="Show the readme")
64add_option('-N', "--release-notes", action="store_true", default=False,
65 help="Show the release notes")
66
67# Options for configuring the base simulator
68add_option('-d', "--outdir", metavar="DIR", default="m5out",
69 help="Set the output directory to DIR [Default: %default]")
70add_option('-r', "--redirect-stdout", action="store_true", default=False,
71 help="Redirect stdout (& stderr, without -e) to file")
72add_option('-e', "--redirect-stderr", action="store_true", default=False,
73 help="Redirect stderr to file")
74add_option("--stdout-file", metavar="FILE", default="simout",
75 help="Filename for -r redirection [Default: %default]")
76add_option("--stderr-file", metavar="FILE", default="simerr",
77 help="Filename for -e redirection [Default: %default]")
78add_option('-i', "--interactive", action="store_true", default=False,
79 help="Invoke the interactive interpreter after running the script")
80add_option("--pdb", action="store_true", default=False,
81 help="Invoke the python debugger before running the script")
82add_option('-p', "--path", metavar="PATH[:PATH]", action='append', split=':',
83 help="Prepend PATH to the system path when invoking the script")
84add_option('-q', "--quiet", action="count", default=0,
85 help="Reduce verbosity")
86add_option('-v', "--verbose", action="count", default=0,
87 help="Increase verbosity")
88
89# Statistics options
90set_group("Statistics Options")
91add_option("--stats-file", metavar="FILE", default="stats.txt",
92 help="Sets the output file for statistics [Default: %default]")
93
94# Configuration Options
95set_group("Configuration Options")
96add_option("--dump-config", metavar="FILE", default="config.ini",
97 help="Dump configuration output file [Default: %default]")
98
99# Debugging options
100set_group("Debugging Options")
101add_option("--debug-break", metavar="TIME[,TIME]", action='append', split=',',
102 help="Cycle to create a breakpoint")
103add_option("--remote-gdb-port", type='int', default=7000,
104 help="Remote gdb base port")
105
106# Tracing options
107set_group("Trace Options")
108add_option("--trace-help", action='store_true',
109 help="Print help on trace flags")
110add_option("--trace-flags", metavar="FLAG[,FLAG]", action='append', split=',',
111 help="Sets the flags for tracing (-FLAG disables a flag)")
112add_option("--trace-start", metavar="TIME", type='int',
113 help="Start tracing at TIME (must be in ticks)")
114add_option("--trace-file", metavar="FILE", default="cout",
115 help="Sets the output file for tracing [Default: %default]")
116add_option("--trace-ignore", metavar="EXPR", action='append', split=':',
117 help="Ignore EXPR sim objects")
118
119# Help options
120set_group("Help Options")
121add_option("--list-sim-objects", action='store_true', default=False,
122 help="List all built-in SimObjects, their parameters and default values")
123
124# load the options.py config file to allow people to set their own
125# default options
126options_file = config.get('options.py')
127if options_file:
128 scope = { 'options' : options }
129 execfile(options_file, scope)
130
131arguments = options.parse_args()
132
133def main():
134 import core
135 import debug
136 import defines
137 import event
138 import info
139 import stats
140 import trace
141
142 def check_tracing():
143 if defines.TRACING_ON:
144 return
145
146 fatal("Tracing is not enabled. Compile with TRACING_ON")
147
148 if not os.path.isdir(options.outdir):
149 os.makedirs(options.outdir)
150
151 # These filenames are used only if the redirect_std* options are set
152 stdout_file = os.path.join(options.outdir, options.stdout_file)
153 stderr_file = os.path.join(options.outdir, options.stderr_file)
154
155 # Print redirection notices here before doing any redirection
156 if options.redirect_stdout and not options.redirect_stderr:
157 print "Redirecting stdout and stderr to", stdout_file
158 else:
159 if options.redirect_stdout:
160 print "Redirecting stdout to", stdout_file
161 if options.redirect_stderr:
162 print "Redirecting stderr to", stderr_file
163
164 # Now redirect stdout/stderr as desired
165 if options.redirect_stdout:
166 redir_fd = os.open(stdout_file, os. O_WRONLY | os.O_CREAT | os.O_TRUNC)
167 os.dup2(redir_fd, sys.stdout.fileno())
168 if not options.redirect_stderr:
169 os.dup2(redir_fd, sys.stderr.fileno())
170
171 if options.redirect_stderr:
172 redir_fd = os.open(stderr_file, os. O_WRONLY | os.O_CREAT | os.O_TRUNC)
173 os.dup2(redir_fd, sys.stderr.fileno())
174
175 done = False
176
177 if options.build_info:
178 done = True
179 print 'Build information:'
180 print
181 print 'compiled %s' % defines.compileDate;
182 print "revision %s" % defines.hgRev
183 print 'build options:'
184 keys = defines.buildEnv.keys()
185 keys.sort()
186 for key in keys:
187 val = defines.buildEnv[key]
188 print ' %s = %s' % (key, val)
189 print
190
191 if options.copyright:
192 done = True
193 print info.LICENSE
194 print
195
196 if options.authors:
197 done = True
198 print 'Author information:'
199 print
200 print info.AUTHORS
201 print
202
203 if options.readme:
204 done = True
205 print 'Readme:'
206 print
207 print info.README
208 print
209
210 if options.release_notes:
211 done = True
212 print 'Release Notes:'
213 print
214 print info.RELEASE_NOTES
215 print
216
217 if options.trace_help:
218 done = True
219 check_tracing()
220 trace.help()
221
222 if options.list_sim_objects:
223 import SimObject
224 done = True
225 print "SimObjects:"
226 objects = SimObject.allClasses.keys()
227 objects.sort()
228 for name in objects:
229 obj = SimObject.allClasses[name]
230 print " %s" % obj
231 params = obj._params.keys()
232 params.sort()
233 for pname in params:
234 param = obj._params[pname]
235 default = getattr(param, 'default', '')
236 print " %s" % pname
237 if default:
238 print " default: %s" % default
239 print " desc: %s" % param.desc
240 print
241 print
242
243 if done:
244 sys.exit(0)
245
246 # setting verbose and quiet at the same time doesn't make sense
247 if options.verbose > 0 and options.quiet > 0:
248 options.usage(2)
249
250 verbose = options.verbose - options.quiet
251 if options.verbose >= 0:
252 print "M5 Simulator System"
253 print brief_copyright
254 print
255
256 print "M5 compiled %s" % defines.compileDate;
257 print "M5 revision %s" % defines.hgRev
258
259 print "M5 started %s" % datetime.datetime.now().strftime("%b %e %Y %X")
260 print "M5 executing on %s" % socket.gethostname()
261
262 print "command line:",
263 for argv in sys.argv:
264 print argv,
265 print
266
267 # check to make sure we can find the listed script
268 if not arguments or not os.path.isfile(arguments[0]):
269 if arguments and not os.path.isfile(arguments[0]):
270 print "Script %s not found" % arguments[0]
271
272 options.usage(2)
273
274 # tell C++ about output directory
275 core.setOutputDir(options.outdir)
276
277 # update the system path with elements from the -p option
278 sys.path[0:0] = options.path
279
280 # set stats options
281 stats.initText(options.stats_file)
282
283 # set debugging options
284 debug.setRemoteGDBPort(options.remote_gdb_port)
285 for when in options.debug_break:
286 debug.schedBreakCycle(int(when))
287
288 if options.trace_flags:
289 check_tracing()
290
291 on_flags = []
292 off_flags = []
293 for flag in options.trace_flags:
294 off = False
295 if flag.startswith('-'):
296 flag = flag[1:]
297 off = True
298 if flag not in trace.flags.all and flag != "All":
299 print >>sys.stderr, "invalid trace flag '%s'" % flag
300 sys.exit(1)
301
302 if off:
303 off_flags.append(flag)
304 else:
305 on_flags.append(flag)
306
307 for flag in on_flags:
308 trace.set(flag)
309
310 for flag in off_flags:
311 trace.clear(flag)
312
313 if options.trace_start:
314 check_tracing()
315 e = event.create(trace.enable, event.Event.Trace_Enable_Pri)
316 event.mainq.schedule(e, options.trace_start)
317 else:
318 trace.enable()
319
320 trace.output(options.trace_file)
321
322 for ignore in options.trace_ignore:
323 check_tracing()
324 trace.ignore(ignore)
325
326 sys.argv = arguments
327 sys.path = [ os.path.dirname(sys.argv[0]) ] + sys.path
328
329 filename = sys.argv[0]
330 filedata = file(filename, 'r').read()
331 filecode = compile(filedata, filename, 'exec')
332 scope = { '__file__' : filename,
333 '__name__' : '__m5_main__' }
334
335 # we want readline if we're doing anything interactive
336 if options.interactive or options.pdb:
337 exec "import readline" in scope
338
339 # if pdb was requested, execfile the thing under pdb, otherwise,
340 # just do the execfile normally
341 if options.pdb:
342 import pdb
343 import traceback
344
345 pdb = pdb.Pdb()
346 try:
347 pdb.run(filecode, scope)
348 except SystemExit:
349 print "The program exited via sys.exit(). Exit status: ",
350 print sys.exc_info()[1]
351 except:
352 traceback.print_exc()
353 print "Uncaught exception. Entering post mortem debugging"
354 t = sys.exc_info()[2]
355 while t.tb_next is not None:
356 t = t.tb_next
357 pdb.interaction(t.tb_frame,t)
358 else:
359 exec filecode in scope
360
361 # once the script is done
362 if options.interactive:
363 interact = code.InteractiveConsole(scope)
364 interact.interact("M5 Interactive Console")
365
366if __name__ == '__main__':
367 from pprint import pprint
368
369 print 'opts:'
370 pprint(options, indent=4)
371 print
372
373 print 'args:'
374 pprint(arguments, indent=4)
36import config
37from options import OptionParser
38
39__all__ = [ 'options', 'arguments', 'main' ]
40
41usage="%prog [m5 options] script.py [script options]"
42version="%prog 2.0"
43brief_copyright='''
44Copyright (c) 2001-2008
45The Regents of The University of Michigan
46All Rights Reserved
47'''
48
49options = OptionParser(usage=usage, version=version,
50 description=brief_copyright)
51add_option = options.add_option
52set_group = options.set_group
53usage = options.usage
54
55# Help options
56add_option('-A', "--authors", action="store_true", default=False,
57 help="Show author information")
58add_option('-B', "--build-info", action="store_true", default=False,
59 help="Show build information")
60add_option('-C', "--copyright", action="store_true", default=False,
61 help="Show full copyright information")
62add_option('-R', "--readme", action="store_true", default=False,
63 help="Show the readme")
64add_option('-N', "--release-notes", action="store_true", default=False,
65 help="Show the release notes")
66
67# Options for configuring the base simulator
68add_option('-d', "--outdir", metavar="DIR", default="m5out",
69 help="Set the output directory to DIR [Default: %default]")
70add_option('-r', "--redirect-stdout", action="store_true", default=False,
71 help="Redirect stdout (& stderr, without -e) to file")
72add_option('-e', "--redirect-stderr", action="store_true", default=False,
73 help="Redirect stderr to file")
74add_option("--stdout-file", metavar="FILE", default="simout",
75 help="Filename for -r redirection [Default: %default]")
76add_option("--stderr-file", metavar="FILE", default="simerr",
77 help="Filename for -e redirection [Default: %default]")
78add_option('-i', "--interactive", action="store_true", default=False,
79 help="Invoke the interactive interpreter after running the script")
80add_option("--pdb", action="store_true", default=False,
81 help="Invoke the python debugger before running the script")
82add_option('-p', "--path", metavar="PATH[:PATH]", action='append', split=':',
83 help="Prepend PATH to the system path when invoking the script")
84add_option('-q', "--quiet", action="count", default=0,
85 help="Reduce verbosity")
86add_option('-v', "--verbose", action="count", default=0,
87 help="Increase verbosity")
88
89# Statistics options
90set_group("Statistics Options")
91add_option("--stats-file", metavar="FILE", default="stats.txt",
92 help="Sets the output file for statistics [Default: %default]")
93
94# Configuration Options
95set_group("Configuration Options")
96add_option("--dump-config", metavar="FILE", default="config.ini",
97 help="Dump configuration output file [Default: %default]")
98
99# Debugging options
100set_group("Debugging Options")
101add_option("--debug-break", metavar="TIME[,TIME]", action='append', split=',',
102 help="Cycle to create a breakpoint")
103add_option("--remote-gdb-port", type='int', default=7000,
104 help="Remote gdb base port")
105
106# Tracing options
107set_group("Trace Options")
108add_option("--trace-help", action='store_true',
109 help="Print help on trace flags")
110add_option("--trace-flags", metavar="FLAG[,FLAG]", action='append', split=',',
111 help="Sets the flags for tracing (-FLAG disables a flag)")
112add_option("--trace-start", metavar="TIME", type='int',
113 help="Start tracing at TIME (must be in ticks)")
114add_option("--trace-file", metavar="FILE", default="cout",
115 help="Sets the output file for tracing [Default: %default]")
116add_option("--trace-ignore", metavar="EXPR", action='append', split=':',
117 help="Ignore EXPR sim objects")
118
119# Help options
120set_group("Help Options")
121add_option("--list-sim-objects", action='store_true', default=False,
122 help="List all built-in SimObjects, their parameters and default values")
123
124# load the options.py config file to allow people to set their own
125# default options
126options_file = config.get('options.py')
127if options_file:
128 scope = { 'options' : options }
129 execfile(options_file, scope)
130
131arguments = options.parse_args()
132
133def main():
134 import core
135 import debug
136 import defines
137 import event
138 import info
139 import stats
140 import trace
141
142 def check_tracing():
143 if defines.TRACING_ON:
144 return
145
146 fatal("Tracing is not enabled. Compile with TRACING_ON")
147
148 if not os.path.isdir(options.outdir):
149 os.makedirs(options.outdir)
150
151 # These filenames are used only if the redirect_std* options are set
152 stdout_file = os.path.join(options.outdir, options.stdout_file)
153 stderr_file = os.path.join(options.outdir, options.stderr_file)
154
155 # Print redirection notices here before doing any redirection
156 if options.redirect_stdout and not options.redirect_stderr:
157 print "Redirecting stdout and stderr to", stdout_file
158 else:
159 if options.redirect_stdout:
160 print "Redirecting stdout to", stdout_file
161 if options.redirect_stderr:
162 print "Redirecting stderr to", stderr_file
163
164 # Now redirect stdout/stderr as desired
165 if options.redirect_stdout:
166 redir_fd = os.open(stdout_file, os. O_WRONLY | os.O_CREAT | os.O_TRUNC)
167 os.dup2(redir_fd, sys.stdout.fileno())
168 if not options.redirect_stderr:
169 os.dup2(redir_fd, sys.stderr.fileno())
170
171 if options.redirect_stderr:
172 redir_fd = os.open(stderr_file, os. O_WRONLY | os.O_CREAT | os.O_TRUNC)
173 os.dup2(redir_fd, sys.stderr.fileno())
174
175 done = False
176
177 if options.build_info:
178 done = True
179 print 'Build information:'
180 print
181 print 'compiled %s' % defines.compileDate;
182 print "revision %s" % defines.hgRev
183 print 'build options:'
184 keys = defines.buildEnv.keys()
185 keys.sort()
186 for key in keys:
187 val = defines.buildEnv[key]
188 print ' %s = %s' % (key, val)
189 print
190
191 if options.copyright:
192 done = True
193 print info.LICENSE
194 print
195
196 if options.authors:
197 done = True
198 print 'Author information:'
199 print
200 print info.AUTHORS
201 print
202
203 if options.readme:
204 done = True
205 print 'Readme:'
206 print
207 print info.README
208 print
209
210 if options.release_notes:
211 done = True
212 print 'Release Notes:'
213 print
214 print info.RELEASE_NOTES
215 print
216
217 if options.trace_help:
218 done = True
219 check_tracing()
220 trace.help()
221
222 if options.list_sim_objects:
223 import SimObject
224 done = True
225 print "SimObjects:"
226 objects = SimObject.allClasses.keys()
227 objects.sort()
228 for name in objects:
229 obj = SimObject.allClasses[name]
230 print " %s" % obj
231 params = obj._params.keys()
232 params.sort()
233 for pname in params:
234 param = obj._params[pname]
235 default = getattr(param, 'default', '')
236 print " %s" % pname
237 if default:
238 print " default: %s" % default
239 print " desc: %s" % param.desc
240 print
241 print
242
243 if done:
244 sys.exit(0)
245
246 # setting verbose and quiet at the same time doesn't make sense
247 if options.verbose > 0 and options.quiet > 0:
248 options.usage(2)
249
250 verbose = options.verbose - options.quiet
251 if options.verbose >= 0:
252 print "M5 Simulator System"
253 print brief_copyright
254 print
255
256 print "M5 compiled %s" % defines.compileDate;
257 print "M5 revision %s" % defines.hgRev
258
259 print "M5 started %s" % datetime.datetime.now().strftime("%b %e %Y %X")
260 print "M5 executing on %s" % socket.gethostname()
261
262 print "command line:",
263 for argv in sys.argv:
264 print argv,
265 print
266
267 # check to make sure we can find the listed script
268 if not arguments or not os.path.isfile(arguments[0]):
269 if arguments and not os.path.isfile(arguments[0]):
270 print "Script %s not found" % arguments[0]
271
272 options.usage(2)
273
274 # tell C++ about output directory
275 core.setOutputDir(options.outdir)
276
277 # update the system path with elements from the -p option
278 sys.path[0:0] = options.path
279
280 # set stats options
281 stats.initText(options.stats_file)
282
283 # set debugging options
284 debug.setRemoteGDBPort(options.remote_gdb_port)
285 for when in options.debug_break:
286 debug.schedBreakCycle(int(when))
287
288 if options.trace_flags:
289 check_tracing()
290
291 on_flags = []
292 off_flags = []
293 for flag in options.trace_flags:
294 off = False
295 if flag.startswith('-'):
296 flag = flag[1:]
297 off = True
298 if flag not in trace.flags.all and flag != "All":
299 print >>sys.stderr, "invalid trace flag '%s'" % flag
300 sys.exit(1)
301
302 if off:
303 off_flags.append(flag)
304 else:
305 on_flags.append(flag)
306
307 for flag in on_flags:
308 trace.set(flag)
309
310 for flag in off_flags:
311 trace.clear(flag)
312
313 if options.trace_start:
314 check_tracing()
315 e = event.create(trace.enable, event.Event.Trace_Enable_Pri)
316 event.mainq.schedule(e, options.trace_start)
317 else:
318 trace.enable()
319
320 trace.output(options.trace_file)
321
322 for ignore in options.trace_ignore:
323 check_tracing()
324 trace.ignore(ignore)
325
326 sys.argv = arguments
327 sys.path = [ os.path.dirname(sys.argv[0]) ] + sys.path
328
329 filename = sys.argv[0]
330 filedata = file(filename, 'r').read()
331 filecode = compile(filedata, filename, 'exec')
332 scope = { '__file__' : filename,
333 '__name__' : '__m5_main__' }
334
335 # we want readline if we're doing anything interactive
336 if options.interactive or options.pdb:
337 exec "import readline" in scope
338
339 # if pdb was requested, execfile the thing under pdb, otherwise,
340 # just do the execfile normally
341 if options.pdb:
342 import pdb
343 import traceback
344
345 pdb = pdb.Pdb()
346 try:
347 pdb.run(filecode, scope)
348 except SystemExit:
349 print "The program exited via sys.exit(). Exit status: ",
350 print sys.exc_info()[1]
351 except:
352 traceback.print_exc()
353 print "Uncaught exception. Entering post mortem debugging"
354 t = sys.exc_info()[2]
355 while t.tb_next is not None:
356 t = t.tb_next
357 pdb.interaction(t.tb_frame,t)
358 else:
359 exec filecode in scope
360
361 # once the script is done
362 if options.interactive:
363 interact = code.InteractiveConsole(scope)
364 interact.interact("M5 Interactive Console")
365
366if __name__ == '__main__':
367 from pprint import pprint
368
369 print 'opts:'
370 pprint(options, indent=4)
371 print
372
373 print 'args:'
374 pprint(arguments, indent=4)