Python getopt

时间:2020-02-23 14:42:45  来源:igfitidea点击:

解析命令行参数是一项非常常见的任务,python getopt模块是解析python命令行参数的选项之一。

Python getopt

  • Python的getopt模块与C的getopt()函数用于解析命令行参数非常相似。

  • 由于此函数类似于C函数和Unix getopt()函数,因此熟悉这些约定的用户会发现使用Python getopt模块函数非常容易。

如果要使用更简单的模块来解析命令行参数,请尝试argparse。

Python getopt函数

" getopt"是模块提供的第一个同名功能。

它解析命令行选项和参数列表。
该功能的签名如下所述:

getopt.getopt(args, shortopts, longopts=[])

其参数包括:

  • args是要传递的参数。

  • shortopts是该脚本接受的选项。

  • 可选参数longopts是此函数接受的String参数的列表,应支持此参数。
    注意,"-"不应在选项名称前加上。

让我们使用一些示例来研究此功能。

Python getopt示例

现在乍看之下这将是棘手的。
我们将看到一个简单的示例,该示例将很棘手,但随后我们将对其进行解释。

这是代码片段:

import getopt
import sys

argv = sys.argv[1:]
try:
  opts, args = getopt.getopt(argv, 'hm:d', ['help', 'my_file='])
  print(opts)
  print(args)
except getopt.GetoptError:
  #Print a message or do something useful
  print('Something went wrong!')
  sys.exit(2)

在此示例中,我们仅接受了一些参数。
在运行脚本之前,让我们对这里发生的事情建立理解:

  • 在sys.argv [1:** 中,我们使用起始索引为1,因为sys.argv [0]是正在运行的脚本的名称,无需在脚本中访问。

  • 现在,getopt函数接受三个参数:
    从sys.argv [1:** 中获得的命令行参数列表,一个包含脚本可接受的所有接受的单字符命令行选项的字符串,以及一个等效于单字符版本。

  • 如果getopt调用发生任何错误,我们还可以捕获Exception并对其进行优雅处理。
    其中我们只是退出了脚本执行。

  • 与任何操作系统中的任何其他命令一样,明智的做法是在用户错误地运行脚本时打印详细信息。

那么," hm:d"是什么意思?看这里:

-h
print help and usage message
-m:
accept custom option value
-d
run the script in debug mode

第一个和最后一个选项是默认选项。
我们使用自定义选项作为m:,注意冒号吗?冒号表示此选项可以获取任何类型的值。
最后,单字符版本与较长版本相同," h"与" help"相同。
您可以提及任何一个。

现在运行脚本:

因此,这将选项和参数收集在单独的列表中。
关于getopt的最好的部分是它允许我们优雅地管理任何可能的异常:

关于my_file =标志,有一点要注意。
必须始终向my_file =标志提供一个附加参数,就像-m标志一样。
这由" my_file ="中的等号描述。

用于GNU样式解析的Python gnu_output()

在Python 2.3中,在getopt模块中添加了另一个函数,称为gnu_output()。
该函数与原始的getopt()函数非常相似,不同之处在于默认情况下使用GNU样式扫描。
我们来看一个有关如何使用此功能的脚本示例:

import getopt
import sys

variant = '1.0'
debug = False
output_file = 'my_file.out'

print('ARGV      :', sys.argv[1:])

options, remainder = getopt.gnu_getopt(
  sys.argv[1:], 'o:v', ['output=', 'debug', 'variant=',])
print('OPTIONS   :', options)

for opt, arg in options:
  if opt in ('-o', '--output'):
      print('Setting --output.')
      output_file = arg
  elif opt in ('-d', '--debug'):
      print('Setting --debug.')
      debug = True
  elif opt == '--variant':
      print('Setting --variant.')
      variant = arg

print('VARIANT   :', variant)
print('DEBUG   :', debug)
print('OUTPUT    :', output_file)
print('REMAINING :', remainder)

在建立理解之前,让我们运行以下脚本:

我们甚至可以尝试运行不带任何参数的脚本:

这描述了不传递任何参数时分配给值的默认值。

如果您想要更大的灵活性,请不要忘记尝试argparse模块。