annotate Lib/getopt.py @ 79691:05c8928362ee

Merge __next__ method link fixes with 3.3.
author Ezio Melotti <ezio.melotti@gmail.com>
date Fri, 12 Oct 2012 13:46:37 +0300
parents 160823d258b5
children 8d28d44f3a9a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11708
4a23cc49e2b0 Actually, the previous batch's comment should have been different;
Guido van Rossum <guido@python.org>
parents: 11615
diff changeset
1 """Parser for command line options.
4280
56909781a741 Layout and cleanup by Fred
Guido van Rossum <guido@python.org>
parents: 4251
diff changeset
2
9489
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
3 This module helps scripts to parse the command line arguments in
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
4 sys.argv. It supports the same conventions as the Unix getopt()
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
5 function (including the special meanings of arguments of the form `-'
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
6 and `--'). Long options similar to those supported by GNU software
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
7 may be used as well via an optional third argument. This module
23699
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
8 provides two functions and an exception:
5
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9
9489
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
10 getopt() -- Parse command line options
23699
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
11 gnu_getopt() -- Like getopt(), but allow option and non-option arguments
24263
e6033254df21 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 23726
diff changeset
12 to be intermixed.
11615
bb1f43f25ce0 Contribution from Gerrit Holl:
Guido van Rossum <guido@python.org>
parents: 9489
diff changeset
13 GetoptError -- exception (class) raised with 'opt' attribute, which is the
bb1f43f25ce0 Contribution from Gerrit Holl:
Guido van Rossum <guido@python.org>
parents: 9489
diff changeset
14 option involved with the exception.
9489
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
15 """
5
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16
9489
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
17 # Long option support added by Lars Wirzenius <liw@iki.fi>.
23699
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
18 #
11852
89b52895310c Gerrit Holl's patch to move attribution from the docstring to a
Fred Drake <fdrake@acm.org>
parents: 11708
diff changeset
19 # Gerrit Holl <gerrit@nl.linux.org> moved the string-based exceptions
89b52895310c Gerrit Holl's patch to move attribution from the docstring to a
Fred Drake <fdrake@acm.org>
parents: 11708
diff changeset
20 # to class-based exceptions.
23699
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
21 #
68789
d3e46930ffe9 Mark getopt error messages as localizable (fixes #11371).
Éric Araujo <merwok@netwok.org>
parents: 64316
diff changeset
22 # Peter Åstrand <astrand@lysator.liu.se> added gnu_getopt().
23699
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
23 #
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
24 # TODO for gnu_getopt():
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
25 #
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
26 # - GNU getopt_long_only mechanism
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
27 # - allow the caller to specify ordering
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
28 # - RETURN_IN_ORDER option
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
29 # - GNU extension with '-' as first character of option string
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
30 # - optional arguments, specified by double colons
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
31 # - a option string with a W followed by semicolon should
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
32 # treat "-W foo" as "--foo"
11852
89b52895310c Gerrit Holl's patch to move attribution from the docstring to a
Fred Drake <fdrake@acm.org>
parents: 11708
diff changeset
33
23726
2cd6ed1c1b58 gnu_getopt should be exported in __all__
Skip Montanaro <skip@pobox.com>
parents: 23708
diff changeset
34 __all__ = ["GetoptError","error","getopt","gnu_getopt"]
16072
bae889f44cd1 more __all__ updates
Skip Montanaro <skip@pobox.com>
parents: 15763
diff changeset
35
23699
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
36 import os
68806
160823d258b5 Issue #11621: fix bootstrap issue with getopt/gettext (following d3e46930ffe9)
Antoine Pitrou <solipsis@pitrou.net>
parents: 68789
diff changeset
37 try:
160823d258b5 Issue #11621: fix bootstrap issue with getopt/gettext (following d3e46930ffe9)
Antoine Pitrou <solipsis@pitrou.net>
parents: 68789
diff changeset
38 from gettext import gettext as _
160823d258b5 Issue #11621: fix bootstrap issue with getopt/gettext (following d3e46930ffe9)
Antoine Pitrou <solipsis@pitrou.net>
parents: 68789
diff changeset
39 except ImportError:
160823d258b5 Issue #11621: fix bootstrap issue with getopt/gettext (following d3e46930ffe9)
Antoine Pitrou <solipsis@pitrou.net>
parents: 68789
diff changeset
40 # Bootstrapping Python: gettext's dependencies not built yet
160823d258b5 Issue #11621: fix bootstrap issue with getopt/gettext (following d3e46930ffe9)
Antoine Pitrou <solipsis@pitrou.net>
parents: 68789
diff changeset
41 def _(s): return s
23699
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
42
11615
bb1f43f25ce0 Contribution from Gerrit Holl:
Guido van Rossum <guido@python.org>
parents: 9489
diff changeset
43 class GetoptError(Exception):
bb1f43f25ce0 Contribution from Gerrit Holl:
Guido van Rossum <guido@python.org>
parents: 9489
diff changeset
44 opt = ''
bb1f43f25ce0 Contribution from Gerrit Holl:
Guido van Rossum <guido@python.org>
parents: 9489
diff changeset
45 msg = ''
27732
fa9f9e57e98f A few naughty external scripts do 'raise getopt.error, "blah"', and
Andrew M. Kuchling <amk@amk.ca>
parents: 24537
diff changeset
46 def __init__(self, msg, opt=''):
15763
35e08dd37df1 GetoptError is always initialized with exactly two parameters, so simplify
Fred Drake <fdrake@acm.org>
parents: 15674
diff changeset
47 self.msg = msg
35e08dd37df1 GetoptError is always initialized with exactly two parameters, so simplify
Fred Drake <fdrake@acm.org>
parents: 15674
diff changeset
48 self.opt = opt
35e08dd37df1 GetoptError is always initialized with exactly two parameters, so simplify
Fred Drake <fdrake@acm.org>
parents: 15674
diff changeset
49 Exception.__init__(self, msg, opt)
11615
bb1f43f25ce0 Contribution from Gerrit Holl:
Guido van Rossum <guido@python.org>
parents: 9489
diff changeset
50
bb1f43f25ce0 Contribution from Gerrit Holl:
Guido van Rossum <guido@python.org>
parents: 9489
diff changeset
51 def __str__(self):
bb1f43f25ce0 Contribution from Gerrit Holl:
Guido van Rossum <guido@python.org>
parents: 9489
diff changeset
52 return self.msg
bb1f43f25ce0 Contribution from Gerrit Holl:
Guido van Rossum <guido@python.org>
parents: 9489
diff changeset
53
bb1f43f25ce0 Contribution from Gerrit Holl:
Guido van Rossum <guido@python.org>
parents: 9489
diff changeset
54 error = GetoptError # backward compatibility
5
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55
4251
ac3fbb6771f5 Rewritten by Lars Wizenius to add long options
Guido van Rossum <guido@python.org>
parents: 564
diff changeset
56 def getopt(args, shortopts, longopts = []):
9489
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
57 """getopt(args, options[, long_options]) -> opts, args
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
58
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
59 Parses command line options and parameter list. args is the
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
60 argument list to be parsed, without the leading reference to the
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
61 running program. Typically, this means "sys.argv[1:]". shortopts
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
62 is the string of option letters that the script wants to
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
63 recognize, with options that require an argument followed by a
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
64 colon (i.e., the same format that Unix getopt() uses). If
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
65 specified, longopts is a list of strings with the names of the
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
66 long options which should be supported. The leading '--'
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
67 characters should not be included in the option name. Options
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
68 which require an argument should be followed by an equal sign
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
69 ('=').
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
70
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
71 The return value consists of two elements: the first is a list of
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
72 (option, value) pairs; the second is the list of program arguments
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
73 left after the option list was stripped (this is a trailing slice
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
74 of the first argument). Each option-and-value pair returned has
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
75 the option as its first element, prefixed with a hyphen (e.g.,
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
76 '-x'), and the option argument as its second element, or an empty
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
77 string if the option has no argument. The options occur in the
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
78 list in the same order in which they were found, thus allowing
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
79 multiple occurrences. Long and short options may be mixed.
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
80
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
81 """
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
82
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
83 opts = []
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
84 if type(longopts) == type(""):
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
85 longopts = [longopts]
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
86 else:
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
87 longopts = list(longopts)
15667
3d55bf65699a Fix for SF bug
Tim Peters <tim.peters@gmail.com>
parents: 11853
diff changeset
88 while args and args[0].startswith('-') and args[0] != '-':
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 4280
diff changeset
89 if args[0] == '--':
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 4280
diff changeset
90 args = args[1:]
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 4280
diff changeset
91 break
21365
5ab9a65e2346 Wrapped a long line.
Fred Drake <fdrake@acm.org>
parents: 16072
diff changeset
92 if args[0].startswith('--'):
9489
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
93 opts, args = do_longs(opts, args[0][2:], longopts, args[1:])
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 4280
diff changeset
94 else:
9489
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
95 opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
4251
ac3fbb6771f5 Rewritten by Lars Wizenius to add long options
Guido van Rossum <guido@python.org>
parents: 564
diff changeset
96
9489
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
97 return opts, args
4251
ac3fbb6771f5 Rewritten by Lars Wizenius to add long options
Guido van Rossum <guido@python.org>
parents: 564
diff changeset
98
23699
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
99 def gnu_getopt(args, shortopts, longopts = []):
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
100 """getopt(args, options[, long_options]) -> opts, args
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
101
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
102 This function works like getopt(), except that GNU style scanning
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
103 mode is used by default. This means that option and non-option
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
104 arguments may be intermixed. The getopt() function stops
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
105 processing options as soon as a non-option argument is
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
106 encountered.
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
107
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
108 If the first character of the option string is `+', or if the
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
109 environment variable POSIXLY_CORRECT is set, then option
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
110 processing stops as soon as a non-option argument is encountered.
24263
e6033254df21 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 23726
diff changeset
111
23699
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
112 """
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
113
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
114 opts = []
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
115 prog_args = []
23708
56a4d3a50b76 Use isinstance for the type check, use booleans.
Martin v. Löwis <martin@v.loewis.de>
parents: 23699
diff changeset
116 if isinstance(longopts, str):
23699
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
117 longopts = [longopts]
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
118 else:
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
119 longopts = list(longopts)
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
120
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
121 # Allow options after non-option arguments?
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
122 if shortopts.startswith('+'):
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
123 shortopts = shortopts[1:]
23708
56a4d3a50b76 Use isinstance for the type check, use booleans.
Martin v. Löwis <martin@v.loewis.de>
parents: 23699
diff changeset
124 all_options_first = True
24389
eb759da064aa Use os.environ.get() in stead of os.getenv() (which is platform-dependent).
Jack Jansen <jack.jansen@cwi.nl>
parents: 24263
diff changeset
125 elif os.environ.get("POSIXLY_CORRECT"):
23708
56a4d3a50b76 Use isinstance for the type check, use booleans.
Martin v. Löwis <martin@v.loewis.de>
parents: 23699
diff changeset
126 all_options_first = True
23699
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
127 else:
23708
56a4d3a50b76 Use isinstance for the type check, use booleans.
Martin v. Löwis <martin@v.loewis.de>
parents: 23699
diff changeset
128 all_options_first = False
23699
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
129
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
130 while args:
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
131 if args[0] == '--':
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
132 prog_args += args[1:]
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
133 break
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
134
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
135 if args[0][:2] == '--':
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
136 opts, args = do_longs(opts, args[0][2:], longopts, args[1:])
50079
a86cdf49b821 Manual merge of r67639 from py3k branch:
Georg Brandl <georg@python.org>
parents: 42293
diff changeset
137 elif args[0][:1] == '-' and args[0] != '-':
23699
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
138 opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
139 else:
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
140 if all_options_first:
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
141 prog_args += args
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
142 break
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
143 else:
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
144 prog_args.append(args[0])
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
145 args = args[1:]
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
146
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
147 return opts, prog_args
18ddc02ce36f Patch 473512: add GNU style scanning as gnu_getopt.
Martin v. Löwis <martin@v.loewis.de>
parents: 22830
diff changeset
148
9489
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
149 def do_longs(opts, opt, longopts, args):
4280
56909781a741 Layout and cleanup by Fred
Guido van Rossum <guido@python.org>
parents: 4251
diff changeset
150 try:
11852
89b52895310c Gerrit Holl's patch to move attribution from the docstring to a
Fred Drake <fdrake@acm.org>
parents: 11708
diff changeset
151 i = opt.index('=')
4280
56909781a741 Layout and cleanup by Fred
Guido van Rossum <guido@python.org>
parents: 4251
diff changeset
152 except ValueError:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 4280
diff changeset
153 optarg = None
15667
3d55bf65699a Fix for SF bug
Tim Peters <tim.peters@gmail.com>
parents: 11853
diff changeset
154 else:
3d55bf65699a Fix for SF bug
Tim Peters <tim.peters@gmail.com>
parents: 11853
diff changeset
155 opt, optarg = opt[:i], opt[i+1:]
4251
ac3fbb6771f5 Rewritten by Lars Wizenius to add long options
Guido van Rossum <guido@python.org>
parents: 564
diff changeset
156
4280
56909781a741 Layout and cleanup by Fred
Guido van Rossum <guido@python.org>
parents: 4251
diff changeset
157 has_arg, opt = long_has_args(opt, longopts)
56909781a741 Layout and cleanup by Fred
Guido van Rossum <guido@python.org>
parents: 4251
diff changeset
158 if has_arg:
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 4280
diff changeset
159 if optarg is None:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 4280
diff changeset
160 if not args:
68789
d3e46930ffe9 Mark getopt error messages as localizable (fixes #11371).
Éric Araujo <merwok@netwok.org>
parents: 64316
diff changeset
161 raise GetoptError(_('option --%s requires argument') % opt, opt)
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 4280
diff changeset
162 optarg, args = args[0], args[1:]
63188
8fa424aecd0d Issue #4629: getopt raises an error if an argument ends with = whereas getopt
Victor Stinner <victor.stinner@haypocalc.com>
parents: 50079
diff changeset
163 elif optarg is not None:
68789
d3e46930ffe9 Mark getopt error messages as localizable (fixes #11371).
Éric Araujo <merwok@netwok.org>
parents: 64316
diff changeset
164 raise GetoptError(_('option --%s must not have an argument') % opt, opt)
9489
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
165 opts.append(('--' + opt, optarg or ''))
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
166 return opts, args
5
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
167
4251
ac3fbb6771f5 Rewritten by Lars Wizenius to add long options
Guido van Rossum <guido@python.org>
parents: 564
diff changeset
168 # Return:
ac3fbb6771f5 Rewritten by Lars Wizenius to add long options
Guido van Rossum <guido@python.org>
parents: 564
diff changeset
169 # has_arg?
ac3fbb6771f5 Rewritten by Lars Wizenius to add long options
Guido van Rossum <guido@python.org>
parents: 564
diff changeset
170 # full option name
ac3fbb6771f5 Rewritten by Lars Wizenius to add long options
Guido van Rossum <guido@python.org>
parents: 564
diff changeset
171 def long_has_args(opt, longopts):
15674
75c3a64847c4 getopt used to sort the long option names, in an attempt to simplify
Tim Peters <tim.peters@gmail.com>
parents: 15667
diff changeset
172 possibilities = [o for o in longopts if o.startswith(opt)]
75c3a64847c4 getopt used to sort the long option names, in an attempt to simplify
Tim Peters <tim.peters@gmail.com>
parents: 15667
diff changeset
173 if not possibilities:
68789
d3e46930ffe9 Mark getopt error messages as localizable (fixes #11371).
Éric Araujo <merwok@netwok.org>
parents: 64316
diff changeset
174 raise GetoptError(_('option --%s not recognized') % opt, opt)
15667
3d55bf65699a Fix for SF bug
Tim Peters <tim.peters@gmail.com>
parents: 11853
diff changeset
175 # Is there an exact match?
3d55bf65699a Fix for SF bug
Tim Peters <tim.peters@gmail.com>
parents: 11853
diff changeset
176 if opt in possibilities:
22830
a9dd5e6d6805 Convert a pile of obvious "yes/no" functions to return bool.
Tim Peters <tim.peters@gmail.com>
parents: 21365
diff changeset
177 return False, opt
15667
3d55bf65699a Fix for SF bug
Tim Peters <tim.peters@gmail.com>
parents: 11853
diff changeset
178 elif opt + '=' in possibilities:
22830
a9dd5e6d6805 Convert a pile of obvious "yes/no" functions to return bool.
Tim Peters <tim.peters@gmail.com>
parents: 21365
diff changeset
179 return True, opt
15667
3d55bf65699a Fix for SF bug
Tim Peters <tim.peters@gmail.com>
parents: 11853
diff changeset
180 # No exact match, so better be unique.
3d55bf65699a Fix for SF bug
Tim Peters <tim.peters@gmail.com>
parents: 11853
diff changeset
181 if len(possibilities) > 1:
3d55bf65699a Fix for SF bug
Tim Peters <tim.peters@gmail.com>
parents: 11853
diff changeset
182 # XXX since possibilities contains all valid continuations, might be
3d55bf65699a Fix for SF bug
Tim Peters <tim.peters@gmail.com>
parents: 11853
diff changeset
183 # nice to work them into the error msg
68789
d3e46930ffe9 Mark getopt error messages as localizable (fixes #11371).
Éric Araujo <merwok@netwok.org>
parents: 64316
diff changeset
184 raise GetoptError(_('option --%s not a unique prefix') % opt, opt)
15667
3d55bf65699a Fix for SF bug
Tim Peters <tim.peters@gmail.com>
parents: 11853
diff changeset
185 assert len(possibilities) == 1
3d55bf65699a Fix for SF bug
Tim Peters <tim.peters@gmail.com>
parents: 11853
diff changeset
186 unique_match = possibilities[0]
3d55bf65699a Fix for SF bug
Tim Peters <tim.peters@gmail.com>
parents: 11853
diff changeset
187 has_arg = unique_match.endswith('=')
3d55bf65699a Fix for SF bug
Tim Peters <tim.peters@gmail.com>
parents: 11853
diff changeset
188 if has_arg:
3d55bf65699a Fix for SF bug
Tim Peters <tim.peters@gmail.com>
parents: 11853
diff changeset
189 unique_match = unique_match[:-1]
3d55bf65699a Fix for SF bug
Tim Peters <tim.peters@gmail.com>
parents: 11853
diff changeset
190 return has_arg, unique_match
4251
ac3fbb6771f5 Rewritten by Lars Wizenius to add long options
Guido van Rossum <guido@python.org>
parents: 564
diff changeset
191
9489
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
192 def do_shorts(opts, optstring, shortopts, args):
4280
56909781a741 Layout and cleanup by Fred
Guido van Rossum <guido@python.org>
parents: 4251
diff changeset
193 while optstring != '':
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 4280
diff changeset
194 opt, optstring = optstring[0], optstring[1:]
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 4280
diff changeset
195 if short_has_arg(opt, shortopts):
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 4280
diff changeset
196 if optstring == '':
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 4280
diff changeset
197 if not args:
68789
d3e46930ffe9 Mark getopt error messages as localizable (fixes #11371).
Éric Araujo <merwok@netwok.org>
parents: 64316
diff changeset
198 raise GetoptError(_('option -%s requires argument') % opt,
21365
5ab9a65e2346 Wrapped a long line.
Fred Drake <fdrake@acm.org>
parents: 16072
diff changeset
199 opt)
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 4280
diff changeset
200 optstring, args = args[0], args[1:]
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 4280
diff changeset
201 optarg, optstring = optstring, ''
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 4280
diff changeset
202 else:
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 4280
diff changeset
203 optarg = ''
9489
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
204 opts.append(('-' + opt, optarg))
db7cca09beaf Accept a non-list sequence for the long options (request by Jack Jansen).
Guido van Rossum <guido@python.org>
parents: 7755
diff changeset
205 return opts, args
4251
ac3fbb6771f5 Rewritten by Lars Wizenius to add long options
Guido van Rossum <guido@python.org>
parents: 564
diff changeset
206
ac3fbb6771f5 Rewritten by Lars Wizenius to add long options
Guido van Rossum <guido@python.org>
parents: 564
diff changeset
207 def short_has_arg(opt, shortopts):
4280
56909781a741 Layout and cleanup by Fred
Guido van Rossum <guido@python.org>
parents: 4251
diff changeset
208 for i in range(len(shortopts)):
7755
fb4b4d069cc7 Mass check-in after untabifying all files that need it.
Guido van Rossum <guido@python.org>
parents: 4280
diff changeset
209 if opt == shortopts[i] != ':':
21365
5ab9a65e2346 Wrapped a long line.
Fred Drake <fdrake@acm.org>
parents: 16072
diff changeset
210 return shortopts.startswith(':', i+1)
68789
d3e46930ffe9 Mark getopt error messages as localizable (fixes #11371).
Éric Araujo <merwok@netwok.org>
parents: 64316
diff changeset
211 raise GetoptError(_('option -%s not recognized') % opt, opt)
4251
ac3fbb6771f5 Rewritten by Lars Wizenius to add long options
Guido van Rossum <guido@python.org>
parents: 564
diff changeset
212
ac3fbb6771f5 Rewritten by Lars Wizenius to add long options
Guido van Rossum <guido@python.org>
parents: 564
diff changeset
213 if __name__ == '__main__':
4280
56909781a741 Layout and cleanup by Fred
Guido van Rossum <guido@python.org>
parents: 4251
diff changeset
214 import sys
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 27732
diff changeset
215 print(getopt(sys.argv[1:], "a:b", ["alpha=", "beta"]))