forked frombpython/bpython
- Notifications
You must be signed in to change notification settings - Fork0
Expand file tree
/
Copy pathargs.py
More file actions
125 lines (100 loc) · 4.39 KB
/
args.py
File metadata and controls
125 lines (100 loc) · 4.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# encoding: utf-8
"""
Module to handle command line argument parsing, for all front-ends.
"""
from __future__importprint_function,absolute_import
importcode
importimp
importos
importsys
fromoptparseimportOptionParser,OptionGroup
from .import__version__
from .configimportdefault_config_path,loadini,Struct
from .translationsimport_
classOptionParserFailed(ValueError):
"""Raised by the RaisingOptionParser for a bogus commandline."""
classRaisingOptionParser(OptionParser):
deferror(self,msg):
raiseOptionParserFailed()
defversion_banner():
return'bpython version %s on top of Python %s %s'% (
__version__,sys.version.split()[0],sys.executable)
defparse(args,extras=None,ignore_stdin=False):
"""Receive an argument list - if None, use sys.argv - parse all args and
take appropriate action. Also receive optional extra options: this should
be a tuple of (title, description, options)
title: The title for the option group
description: A full description of the option group
options: A list of optparse.Option objects to be added to the
group
e.g.:
parse(
['-i', '-m', 'foo.py'],
('Front end-specific options',
'A full description of what these options are for',
[optparse.Option('-f', action='store_true', dest='f', help='Explode'),
optparse.Option('-l', action='store_true', dest='l', help='Love')]))
Return a tuple of (config, options, exec_args) wherein "config" is the
config object either parsed from a default/specified config file or default
config options, "options" is the parsed options from
OptionParser.parse_args, and "exec_args" are the args (if any) to be parsed
to the executed file (if any).
"""
ifargsisNone:
args=sys.argv[1:]
parser=RaisingOptionParser(
usage=_('Usage: %prog [options] [file [args]]\n'
'NOTE: If bpython sees an argument it does '
'not know, execution falls back to the '
'regular Python interpreter.'))
# This is not sufficient if bpython gains its own -m support
# (instead of falling back to Python itself for that).
# That's probably fixable though, for example by having that
# option swallow all remaining arguments in a callback.
parser.disable_interspersed_args()
parser.add_option('--config',default=default_config_path(),
help=_('Use CONFIG instead of default config file.'))
parser.add_option('--interactive','-i',action='store_true',
help=_('Drop to bpython shell after running file '
'instead of exiting.'))
parser.add_option('--quiet','-q',action='store_true',
help=_("Don't flush the output to stdout."))
parser.add_option('--version','-V',action='store_true',
help=_('Print version and exit.'))
ifextrasisnotNone:
extras_group=OptionGroup(parser,extras[0],extras[1])
foroptioninextras[2]:
extras_group.add_option(option)
parser.add_option_group(extras_group)
try:
options,args=parser.parse_args(args)
exceptOptionParserFailed:
# Just let Python handle this
os.execv(sys.executable, [sys.executable]+args)
ifoptions.version:
print(version_banner())
print('(C) 2008-2016 Bob Farrell, Andreas Stuehrk, Sebastian Ramacher, Thomas Ballinger, et al. '
'See AUTHORS for detail.')
raiseSystemExit
ifnotignore_stdinandnot (sys.stdin.isatty()andsys.stdout.isatty()):
interpreter=code.InteractiveInterpreter()
interpreter.runsource(sys.stdin.read())
raiseSystemExit
config=Struct()
loadini(config,options.config)
returnconfig,options,args
defexec_code(interpreter,args):
"""
Helper to execute code in a given interpreter. args should be a [faked]
sys.argv
"""
withopen(args[0],'r')assourcefile:
source=sourcefile.read()
old_argv,sys.argv=sys.argv,args
sys.path.insert(0,os.path.abspath(os.path.dirname(args[0])))
mod=imp.new_module('__console__')
sys.modules['__console__']=mod
interpreter.locals=mod.__dict__
interpreter.locals['__file__']=args[0]
interpreter.runsource(source,args[0],'exec')
sys.argv=old_argv