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