Python Optparse 模块

2025 年 1 月 11 日 | 17 分钟阅读

命令行参数和解析输入参数是编程和开发的重要方面。命令行参数只不过是在程序名称之后在系统命令行中指定的参数。当我们通过这些命令行参数传递值时,这些值直接传递到程序的参数中,这就是参数或变量的值存储在程序内存中的方式。命令行参数在系统命令提示符 shell 中在程序名称之后给出,我们正在为其传递这些参数。

所有这些参数都传递到程序的主函数 (main()) 内部,并且通常只包含以下两个参数:

  • 应在程序中传递的参数数量
  • 在程序中传递的命令行参数列表

这两种类型的参数在 main() 函数内部使用,第二种类型的参数取自命令行参数。解析参数意味着程序如何处理我们传递的命令行参数。此外,所有我们传递到命令提示符 shell 中的命令行参数或参数都只由程序的主函数 (main()) 处理。当我们需要传递动态数据以及一次传递多个值时,这些命令行参数非常有用。当在单个命令行调用中传递多个参数时,这些值将根据变量和函数的数据类型和功能分配给程序的相应变量。这使我们可以轻松地同时传递多个值,甚至无需将所有值分配给它们的特定变量和函数。

所有编程语言都为命令行参数和解析这些参数提供了不同类型的函数,但具体来说,Python 为我们提供了许多内置函数以及多个包来执行这些任务。其中一个 Python 包是 Python 的 Optparse 模块,我们可以使用它来设置命令行参数并通过 Python 程序解析这些参数。因此,在本教程中,我们将学习 Python 的 optparse 模块,我们将使用此模块的函数传递和解析命令行参数。

Python Optparse 模块简介

Python 的 optparse 模块是替代 getopt 包的一个很好的选择,它已成为在 Python 程序中处理和解析命令行参数的现代替代选项。此模块用于通过其函数在 Python 程序中传递和解析命令行参数。Optparse 模块是 getopt 包的一个非常好的选择,因为以前在 getopt 包中不可用的许多功能现在都可以在此模块中使用。许多功能,例如自动帮助生成、选项回调和类型转换,以前在 getopt 包中不可用,但现在这些选项在 optparse 模块中可用。这就是为什么 optparse 模块在解析命令行参数方面比 getopt 包越来越受欢迎和优选。除了以前在 getopt 包中不可用的功能外,optparse 模块还引入了许多新功能。在本教程中,我们将只讨论此模块的一些基本功能和特性。在本教程中,我们将使用一些示例程序来演示 optparse 模块的一些基本功能。

Python 的 Optparse 模块:优点

以下是 Python 的 optparse 模块相对于其他包的一些优点:

  1. optparse 直观易学,是初学者或希望快速向脚本添加命令行选项的人的绝佳选择。该模块为定义选项和参数提供了一个简洁直观的界面。
  2. 当您使用 optparse 定义选项时,该模块会自动生成帮助消息。用户可以通过使用 -h 或 --help 标志查看这些消息,其中详细说明了可用的选项以及如何使用它们。这有助于创建用户友好的命令行工具,而无需额外的努力。友好的命令行工具,而无需额外的努力。
  3. optparse 允许您为每个选项指定预期类型,例如 int、float、string 等。这确保输入会自动验证并转换为适当的类型。这种类型检查减少了代码中手动输入验证的需要。

这些是使用 Python 的 optparse 模块的一些常见优点,我们可以从这些优点中了解为什么该模块在 Python 的所有其他用于命令行参数的包中如此受欢迎和优选。

Python 的 Optparse 模块:安装

optparse 模块是 Python 内置的,因此我们无需执行任何安装过程即可使用此模块。我们可以通过将此模块导入示例 Python 程序来直接开始使用 optparse 模块。要在 Python 程序中导入此模块,我们可以使用以下代码行:

之后,我们可以在程序中使用此模块的函数,并使用此模块处理命令行参数。

使用 Optparse 模块

在此部分中,我们将讨论 optparse 模块中可用的多个函数和选项,我们可以使用它们非常轻松地解析命令行参数。我们还将在此部分中使用示例程序来更好地理解 optparse 模块的实现。但首先,我们将学习创建选项解析器对象,因为此对象将解析为程序主函数 (main()) 传递的命令行参数。

创建 OptionParser 对象

我们可以通过 optparse 模块通过以下两个阶段解析命令行参数:

  • 首先,我们必须在程序中创建一个 OptionParser 实例来处理命令行参数,并且它应该根据命令行参数中可以给出的预期选项或值进行配置和构建。
  • 之后,从命令行参数中给出一系列选项或值,并在程序中进行处理。

因此,首先,我们必须在程序中创建一个 OptionParser 实例,我们可以使用 optparse 模块的 optionparser() 函数来完成此操作。我们可以在任何 Python 程序中使用以下代码行创建一个具有 optionparser 属性的 OptionParser 实例来解析命令行参数:

正如我们所看到的,我们已将 optparse 模块导入为 opt,之后我们使用了 optionparser() 函数来创建一个 OptionParser 实例并将其命名为“opInstance”。

一旦创建了 OptionParser 实例,程序中使用的所有 optparse 选项都会隐式添加到解析器实例中。它还为我们提供了有关当在命令行上遇到定义的选项时我们可以做什么的信息。OptionParser 实例还为我们提供了可以在程序中将选项列表传递给 OptionParser 构造函数的函数。但需要注意的是,这种使用 OptionParser 实例中选项的形式并不常用。

定义选项

在程序的 OptionParser 实例中定义选项时,我们应该记住选项应该一次添加一个。程序中定义的每个选项实例都代表一组同义的命令行选项字符串。我们可以使用 add_options() 函数在程序中定义选项,该函数将隐式添加到 OptionParser 实例中。在参数的开头,我们可以使用任何未命名的字符串参数,这些参数被视为选项实例名称。我们可以为我们定义的选项创建别名,即为我们定义的同一选项同时拥有长格式和短格式,只需为其传递多个名称即可。

我们有两种方法可以使用 OptionParser 在程序中创建选项实例。 以下是我们在程序中创建 OptionParser 选项实例的两种方法:

方法 1:仅提供选项参数

在此方法中,我们将在 add_option() 参数中提供选项参数,并使用以下代码行创建选项实例:

方法 2:提供字符串和值参数

在此方法中,我们将在函数的属性选项中提供值参数,并在定义选项实例时在 add_option() 中提供可选字符串。我们可以使用以下代码行通过此方法定义选项实例:

我们可以在这两种方法中以长格式和短格式使用定义的选项实例。

如果我们只想定义短选项字符串和长选项字符串的选项,那么我们必须使用两种不同的方法(一种用于短选项字符串,第二种用于长选项字符串)。因此,通过这两种方法定义的选项将只采用短选项字符串值或长选项字符串值,具体取决于我们用于定义选项的函数。以下是我们可以用来定义短选项字符串或长选项字符串的两个函数:

1) 仅为长选项字符串定义选项

我们可以使用 add_option() 函数的以下方法来仅为长选项字符串值定义选项:

正如我们所看到的,我们必须在 add_option() 函数的可选参数位置给出“--foo”值,以定义长选项字符串的选项实例。

2) 为短选项字符串定义选项实例

我们可以使用 add_option() 函数的以下代码行来定义短选项字符串值的选项实例:

正如我们所看到的,我们必须在 add_option() 函数的可选参数位置给出“-f”参数,以定义短选项字符串的选项实例。

这就是我们如何专门为长选项字符串或短选项字符串定义选项实例,并且这些选项实例产生的输出仅以长或短字符串形式出现,具体取决于我们使用的方法。

选项实例的标准操作

我们在程序中用 OptionParser 构造函数定义的选项实例有一些标准操作选项。这些标准选项操作用于执行多种功能并将特定类型的输入值存储在其中。我们可以使用这些选项操作来设置我们想要在这些选项实例中存储的值类型,具体取决于程序的功能和预期输出。 以下是选项实例可用的标准选项操作:

  • “append”:此操作用于将此选项实例的选项参数追加到列表中
  • “store”:“store”操作用于存储选项实例的选项参数,并且它在 add_option() 函数中默认设置
  • “store_false”:此选项用于在选项实例中存储 false 参数
  • “store_true”:此选项用于在选项实例中存储 true 参数
  • “append_const”:“append_const”操作在选项实例中使用,用于将选项实例中的常量值追加到列表中
  • “store_const”:此选项在选项实例中使用,用于在实例中存储常量值

这些是使用 add_option 函数与 optionparser 构造函数定义的所有选项实例可用的标准选项操作。我们可以使用其中一个或多个来设置在解析命令行参数时存储或/和追加哪些值。

标准选项属性

我们定义的选项实例也有几个属性,这些属性定义了这些选项实例在程序中的功能和工作方式。这些属性用作值以在解析输入命令时获取一些特定参数,或在程序中执行一些特定功能。

以下是使用 add_option() 函数定义的选项实例的标准选项属性:

  • optionInstance.default:此属性在选项实例中使用的值用于此选项实例的目标,当此选项实例未在命令行中看到时
  • optionInstance.dest:它是选项实例的默认属性,它派生自作为输入参数提供的选项字符串
  • optionInstance.type:此属性用于设置此选项实例获取的值的数据类型,默认情况下,它设置为“strings”
  • optionInstance.action:此属性在选项实例中用于设置将对选项实例中给出的值执行什么操作,默认情况下,此属性设置为“store”操作

我们可以使用选项实例可用的这些属性来设置这些选项实例将获取哪些数据类型值以及将在程序中对这些值执行哪些操作。

Python Optparse 模块:实现

在此部分中,我们将通过一些示例程序来理解 Python 的 optparse 模块的实现,其中我们将解析命令行参数。我们将通过执行多种功能来理解此模块的实现,例如在命令行参数中获取输入值,使用此模块的类和函数。我们将通过它们产生的输出及其解释来理解这些示例程序的工作原理。

请看以下示例程序以了解 optparse 模块的工作原理

实现 1:在选项实例中同时使用长选项值和短选项值

在此实现部分中,我们将通过在示例程序中定义它们来理解 optionparser 和选项实例的工作原理。我们将为长选项字符串和短选项字符串定义选项实例,并在从系统命令 shell 执行它们时逐一调用它们。请看以下示例程序以理解 optparse 模块的此实现部分。

示例 1:请看以下 Python 程序,其中我们定义了长短选项实例

使用短选项字符串参数调用时

输出

$ python code.py -s sample3.txt
ARGV value for option instances    : ['-s', 'sample3.txt']
VERSION of the input string   : 1.0
VERBOSE for the input value   : False
OUTPUT with respect to input string    : sample3.txt
REMAINING for remainder is the function : []
While calling with the long option string argument:
$ python code.py --long sample4.txt
ARGV value for option instances    : ['--long', 'sample4.txt']
VERSION of the input string   : 1.0
VERBOSE for the input value   : False
OUTPUT with respect to input string    : sample4.txt
REMAINING for remainder is the function : []
While calling with a custom argument for the option instance:
$ python code.py --lon sample4.txt
ARGV value for option instances    : ['--lon', 'sample4.txt']
VERSION of the input string   : 1.0
VERBOSE for the input value   : False
OUTPUT with respect to input string    : sample4.txt
REMAINING for remainder is the function : [] 

正如我们所看到的,我们已在选项实例中同时调用了长选项字符串和短选项,使用了函数中的 long 或 short 关键字参数。我们还为选项实例提供了一个自定义参数,并且选项实例也使用自定义参数调用,这就是它存储这些值的方式。这就是我们如何使用 optparse 模块的函数来创建长短选项字符串实例。

说明

我们首先在程序中导入了 optparse 和 sys 模块,以使用这些模块的函数。之后,我们在 print 语句中使用了 sys 模块的 argv 函数来打印从程序调用的选项实例。然后,我们使用 OptionParser() 函数创建了 optionparser 构造函数,并将构造函数变量命名为“opConst”。之后,我们使用此变量 optionparser 构造函数通过 add_opions() 函数在程序中创建选项实例。然后,我们在程序中创建了三个选项实例,并且在这些选项实例中,我们提供了长或短选项字符串参数来定义选项实例的类型。之后,我们使用了 optparse 模块的 parse_args() 函数来解析命令行参数。最后,我们在 print 语句中使用了 optparse 模块的这些 args 变量来打印选项实例中的一些特定信息。解析命令行参数后,我们在打印此信息之前定义了信息类别。

实现 2:在选项实例中传递值

在此实现部分中,我们将为我们在选项实例中定义的参数传递值。在程序中解析命令行参数后,我们在此程序中传递的这些值将在输出中打印。我们应该记住,我们传递的值的数据类型应该与我们在选项实例中定义的数据类型相同;否则,它将在输出中产生错误。请看以下示例程序以理解 optparse 模块的此实现部分。

示例 2:请看以下程序,其中我们为选项实例传递了值

输出

$ python code.py -a 5 -b 31.26 -c 24260000 -d 24+26j -s max
The int data type input value for the first option : <class 'int'>    5
The float data type input value for the second option : <class 'float'>  31.26
The long data type input value for the third option : <class 'int'>    24260000
The complex data type input value for the fourth option : <class 'complex'> (24+26j)
The string data type input value for the last option : <class 'str'>    max

正如我们所看到的,在给出具有不同数据类型的输入值后,这些输入值被分配给各自的数据类型选项实例。这就是我们如何使用命令行 shell 给出不同数据类型的输入值并将它们解析到定义的选项实例。

说明

在定义 optionparser 构造函数之后,我们在程序中定义了多个选项实例。这些选项实例定义时将 action 参数设置为“store”,以便给定输入值将存储到这些选项实例中。此外,这些选项实例设置为采用不同的数据类型,以便当输入中给定特定数据类型的值时,它将仅存储到该特定选项实例中。最后,我们使用 print 语句中的 parsedOptions 构造函数打印了已解析并存储到特定选项实例的输入值。我们还在结果中打印了值的 p 属性(数据类型)和值。

注意:需要注意的是,在为选项实例提供输入值时,如果我们提供与选项实例中定义的数据类型不同的数据类型输入值,则会发生错误,并且输出中将显示错误消息。为了演示这一点,我们将运行 Python 代码并提供与选项实例数据类型不同的数据类型值。请看以下示例程序以理解选项实例的这个概念:

输出

$ python code.py -a c
Usage: code.py [options]

code.py: error: option -a: invalid integer value: 'c'  

正如我们所看到的,当我们为选项实例提供不同的数据类型输入值时,输出中会显示错误消息。

实现 3:解析命令行参数以打印表格

到目前为止,我们已经理解了选项实例和 optionparser 构造函数的工作原理和实现。现在,我们将使用 optparse 模块及其函数从输入值在命令行 shell 中打印一个表格。我们将在程序中使用 for 循环循环遍历输入值,从而使用 optparse 模块的函数在命令 shell 中打印表格。这将帮助我们更好地理解使用 optparse 模块解析命令行参数的工作原理和实际实现。请看以下示例程序,其中我们在命令 shell 中打印了表格:

示例 4:请看以下 Python 程序以了解 optparse 模块的实际实现

输出

1. 仅打印基本输出(-m 和 -b 选项)

命令

输出

5
10
15
20
25
30
35
40
45
50
This is the table of the given input value number. The last term is: 50

2. 带文件写入的输出(-m、-b 和 -c 选项)

命令

控制台输出

 
7
14
21
28
35
42
49
56
63
70
This is the table of the given input value number. The last term is: 70 

output.txt 内容

 
7
14
21
28
35
42
49
56
63
70  

3. -m 缺失时的错误处理

命令

输出

 
Error: Please specify a number using -m option.
Usage: table_script.py [options]  

4. 仅带文件写入的输出(-m 和 -c 选项,不带 -b)

命令

控制台输出

output.txt 内容

总结

  • 如果单独指定 -m 选项,它将生成乘法表。
  • 如果添加 -b 选项,脚本将打印整个表格。
  • 如果还包括 -c 选项,脚本除了打印之外,还会将表格附加到指定文件中。