optparse --- 命令列選項剖析器¶
原始碼:Lib/optparse.py
選擇一個命令列參數剖析函式庫¶
標準函式庫包含三個命令列引數剖析函式庫:
getopt: a module that closely mirrors the procedural CgetoptAPI. Included in the standard library since before the initial Python 1.0 release.optparse: a declarative replacement forgetoptthat provides equivalent functionality without requiring each application to implement its own procedural option parsing logic. Included in the standard library since the Python 2.3 release.argparse: a more opinionated alternative tooptparsethat provides more functionality by default, at the expense of reduced application flexibility in controlling exactly how arguments are processed. Included in the standard library since the Python 2.7 and Python 3.2 releases.
In the absence of more specific argument parsing design constraints, argparse
is the recommended choice for implementing command line applications, as it offers
the highest level of baseline functionality with the least application level code.
getopt is retained almost entirely for backwards compatibility reasons.
However, it also serves a niche use case as a tool for prototyping and testing
command line argument handling in getopt-based C applications.
optparse should be considered as an alternative to argparse in the
following cases:
an application is already using
optparseand doesn't want to risk the subtle behavioural changes that may arise when migrating toargparsethe application requires additional control over the way options and positional parameters are interleaved on the command line (including the ability to disable the interleaving feature completely)
the application requires additional control over the incremental parsing of command line elements (while
argparsedoes support this, the exact way it works in practice is undesirable for some use cases)the application requires additional control over the handling of options which accept parameter values that may start with
-(such as delegated options to be passed to invoked subprocesses)the application requires some other command line parameter processing behavior which
argparsedoes not support, but which can be implemented in terms of the lower level interface offered byoptparse
These considerations also mean that optparse is likely to provide a
better foundation for library authors writing third party command line
argument processing libraries.
As a concrete example, consider the following two command line argument
parsing configurations, the first using optparse, and the second
using argparse:
import optparse
if __name__ == '__main__':
parser = optparse.OptionParser()
parser.add_option('-o', '--output')
parser.add_option('-v', dest='verbose', action='store_true')
opts, args = parser.parse_args()
process(args, output=opts.output, verbose=opts.verbose)
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-o', '--output')
parser.add_argument('-v', dest='verbose', action='store_true')
parser.add_argument('rest', nargs='*')
args = parser.parse_args()
process(args.rest, output=args.output, verbose=args.verbose)
The most obvious difference is that in the optparse version, the non-option
arguments are processed separately by the application after the option processing
is complete. In the argparse version, positional arguments are declared and
processed in the same way as the named options.
However, the argparse version will also handle some parameter combination
differently from the way the optparse version would handle them.
For example (amongst other differences):
supplying
-o -vgivesoutput="-v"andverbose=Falsewhen usingoptparse, but a usage error withargparse(complaining that no value has been supplied for-o/--output, since-vis interpreted as meaning the verbosity flag)similarly, supplying
-o --givesoutput="--"andargs=()when usingoptparse, but a usage error withargparse(also complaining that no value has been supplied for-o/--output, since--is interpreted as terminating the option processing and treating all remaining values as positional arguments)supplying
-o=foogivesoutput="=foo"when usingoptparse, but givesoutput="foo"withargparse(since=is special cased as an alternative separator for option parameter values)
Whether these differing behaviors in the argparse version are
considered desirable or a problem will depend on the specific command line
application use case.
也參考
click is a third party argument processing library (originally
based on optparse), which allows command line applications to be
developed as a set of decorated command implementation functions.
Other third party libraries, such as typer or msgspec-click, allow command line interfaces to be specified in ways that more effectively integrate with static checking of Python type annotations.
Introduction¶
optparse is a more convenient, flexible, and powerful library for parsing
command-line options than the minimalist getopt module.
optparse uses a more declarative style of command-line parsing:
you create an instance of OptionParser,
populate it with options, and parse the command line.
optparse allows users to specify options in the conventional
GNU/POSIX syntax, and additionally generates usage and help messages for you.
Here's an example of using optparse in a simple script:
from optparse import OptionParser
...
parser = OptionParser()
parser.add_option("-f", "--file", dest="filename",
help="write report to FILE", metavar="FILE")
parser.add_option("-q", "--quiet",
action="store_false", dest="verbose", default=True,
help="don't print status messages to stdout")
(options, args) = parser.parse_args()
With these few lines of code, users of your script can now do the "usual thing" on the command-line, for example:
<yourscript> --file=outfile -q
As it parses the command line, optparse sets attributes of the
options object returned by parse_args() based on user-supplied
command-line values. When parse_args() returns from parsing this command
line, options.filename will be "outfile" and options.verbose will be
False. optparse supports both long and short options, allows short
options to be merged together, and allows options to be associated with their
arguments in a variety of ways. Thus, the following command lines are all
equivalent to the above example:
<yourscript> -f outfile --quiet
<yourscript> --quiet --file outfile
<yourscript> -q -foutfile
<yourscript> -qfoutfile
Additionally, users can run one of the following
<yourscript> -h
<yourscript> --help
and optparse will print out a brief summary of your script's options:
Usage: <yourscript> [options]
Options:
-h, --help show this help message and exit
-f FILE, --file=FILE write report to FILE
-q, --quiet don't print status messages to stdout
where the value of yourscript is determined at runtime (normally from
sys.argv[0]).
背景¶
optparse was explicitly designed to encourage the creation of programs
with straightforward command-line interfaces that follow the conventions
established by the getopt() family of functions available to C developers.
To that end, it supports only the most common command-line syntax and semantics
conventionally used under Unix. If you are unfamiliar with these conventions,
reading this section will allow you to acquaint yourself with them.
術語¶
- 引數
a string entered on the command-line, and passed by the shell to
execl()orexecv(). In Python, arguments are elements ofsys.argv[1:](sys.argv[0]is the name of the program being executed). Unix shells also use the term "word".It is occasionally desirable to substitute an argument list other than
sys.argv[1:], so you should read "argument" as "an element ofsys.argv[1:], or of some other list provided as a substitute forsys.argv[1:]".- 選項
an argument used to supply extra information to guide or customize the execution of a program. There are many different syntaxes for options; the traditional Unix syntax is a hyphen ("-") followed by a single letter, e.g.
-xor-F. Also, traditional Unix syntax allows multiple options to be merged into a single argument, e.g.-x -Fis equivalent to-xF. The GNU project introduced--followed by a series of hyphen-separated words, e.g.--fileor--dry-run. These are the only two option syntaxes provided byoptparse.Some other option syntaxes that the world has seen include:
a hyphen followed by a few letters, e.g.
-pf(this is not the same as multiple options merged into a single argument)a hyphen followed by a whole word, e.g.
-file(this is technically equivalent to the previous syntax, but they aren't usually seen in the same program)a plus sign followed by a single letter, or a few letters, or a word, e.g.
+f,+rgb