Есть ли в любом случае, чтобы убедить Getopt от Python обрабатывать дополнительные параметры с параметрами?

StackOverflow https://stackoverflow.com/questions/1532737

  •  20-09-2019
  •  | 
  •  

Вопрос

Согласно документации на Python's getopt (Я думаю) Поля вариантов должны вести себя как getopt() функция Однако, кажется, я не могу включить дополнительные параметры для моего кода:

#!/usr/bin/python
import sys,getopt

if __name__ == "__main__":
    try:
        opts, args = getopt.gnu_getopt(sys.argv[1:], "v::", ["verbose="])
    except getopt.GetoptError, err:
        print str(err)
        sys.exit(1)

    for o,a in opts:
        if o in ("-v", "--verbose"):
            if a:
                verbose=int(a)
            else:
                verbose=1
            print "verbosity is %d" % (verbose)

Результаты:

$ ./testopt.py -v
option -v requires argument
$ ./testopt.py -v 1
verbosity is 1
Это было полезно?

Решение

getopt не поддерживает дополнительные параметры. В случае длительного варианта вы можете сделать:

$ ./testopt.py --verbose=

что приведет к значению пустой строки.

Вы могли бы найти argparse модуль, чтобы быть более гибким.

Другие советы

К сожалению, нет никакого пути. От OptParse Docs:

Как правило, заданный вариант либо принимает аргумент, либо нет. Многие люди хотят функцию «необязательные аргументы», а это означает, что некоторые варианты будут принимать аргумент, если они увидят это, и не будут, если они этого не сделают. Это несколько противоречиво, потому что он делает расстановку неоднозначным: если «-a» принимает необязательный аргумент, а «-b»-это еще один вариант, как мы интерпретируем «-ab»? Из -за этой двусмысленности OptParse не поддерживает эту функцию.

РЕДАКТИРОВАТЬ: Ой, то есть для модуля OptParse, а не модуля getopt, но рассуждения, почему ни один модуль не имеет «необязательных аргументов опции», одинакова для обоих.

Вы можете сделать дополнительный параметр с Getopt, как это:

import getopt
import sys

longopts, shortopts = getopt.getopt(sys.argv[1:], shortopts='', longopts=['env='])
argDict = dict(longopts)

if argDict.has_key('--env') and argDict['--env'] == 'prod':
    print "production"
else:
    print "sandbox"

Применение:

$ python scratch.py --env=prod
production

$ python scratch.py --env=dev
sandbox

$ python scratch.py
sandbox

Если вы используете версию 2.3 или позже, вы можете попробовать OptParse Вместо этого модуль, так как он «более удобный, гибкий и мощный ...», а также новее. Увы, как ответил Пинт, кажется, что невозможно получить именно то, что вы хотите.

python's getopt should really support optional args, like GNU getopt by requiring '=' be used when specifying a parameter. Now you can simulate it quite easily though, with this constraint by implicitly changing --option to --option=

I.E. you can specify that --option requires an argument, and then adjust --option to --option= as follows:

for i, opt in enumerate(sys.argv):
    if opt == '--option':
        sys.argv[i] = '--option='
    elif opt == '--':
        break
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top