如何在getopt中设置cmd参数未设置时的默认值

2 投票
3 回答
4296 浏览
提问于 2025-04-18 09:31

我在Python脚本中使用getopt来解析命令行参数。请问可以为命令行参数设置默认值吗?

try:
  opts, args = getopt.getopt(argv,"htt:tf:d:",["from=","to=","on="])
except getopt.GetoptError:
  print 'logReader.py -f <from> -t <to> -d <on>'
  sys.exit(2)
for opt, arg in opts:
  if opt == '-h':
    print 'logReader.py -f <from> -t <to> -d <on>'
    sys.exit()
  elif opt in ("-f", "--from"):
    fromTime = arg
  elif opt in ("-t", "--to"):
    toTime = arg
  elif opt in ("-d", "--on"):
    onDate = arg 

所以我想要这样做:如果没有设置from,那么fromTime应该被设置为一个默认值。

3 个回答

0

最简单的方法就是在查看参数之前,先设置好参数的值。如果用户在命令行没有指定这个参数,它就会使用默认值:

try:   
    opts, args = getopt.getopt(argv,"htt:tf:d:",["from=","to=","on="])         
except getopt.GetoptError:
    print 'logReader.py -f <from> -t <to> -d <on>'   
    sys.exit(2)

fromTime = Default_value

for opt, arg in opts:
    if opt == '-h':
        print 'logReader.py -f <from> -t <to> -d <on>'
        sys.exit()
    elif opt in ("-f", "--from"):
        fromTime = arg
    elif opt in ("-t", "--to"):
        toTime = arg
    elif opt in ("-d", "--on"):
        onDate = arg

如果用户指定了 -f--from,那么这个值就会覆盖默认值。记得在你的 -h 帮助信息中提到这个默认值哦。

3

使用内置的 argparse 包,你可以这样做:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-p', '--population',
                    required=False,
                    type=int,
                    default=100, 
                    dest="pop",
                    metavar="<number of individuals>",
                    help="Number of individuals in each population" )
parser.add_argument('-g', '--generation',
                    required=False,
                    type=int,
                    default=30, 
                    dest="ngen",
                    metavar="<number of generations>",
                    help="Number of generations to calculate" )
args = parser.parse_args()

如你所见,你可以定义参数类型、默认值、使用信息、参数的长短版本等等。一旦创建了这个对象,你就可以通过它的 dest 属性来访问这些值。例如,参数 -g 会存储在 args.ngen 中,而 -p 会存储在 args.pop 中。

关于兼容性问题,argparse 在 Python 版本 2.3 及以上是可以使用的,具体可以查看它的 pypi 页面。只需安装它或者把它打包进你的项目里就可以了。

2

使用 argparse,这是从 教程 修改过来的:

import argparse
parser = argparse.ArgumentParser()
# The -- indicates that it is optional 
parser.add_argument("--verbosity", help="increase output verbosity") 
args = parser.parse_args()
if args.verbosity:
    print "verbosity turned on"
else:
    print "Default option"

这样,如果没有添加可选参数,它就会执行 else 语句。它还会添加一个帮助手册,你可以在里面解释所有的选项。如果解析参数失败,它会自动返回脚本的选项。(自动执行这个 logReader.py -f <from> -t <to> -d <on>

在评论中,提问者表示由于版本问题,argparse 不再考虑使用。

我看到的其他选项有 optparse, 或者直接使用基本的 sys.argv,然后用 else 语句来处理。

撰写回答