Есть ли способ убедить getopt Python обрабатывать необязательные параметры для параметров? - PullRequest
6 голосов
/ 07 октября 2009

Согласно документации на Python 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

Ответы [ 5 ]

9 голосов
/ 07 октября 2009

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

$ ./testopt.py --verbose=

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

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

5 голосов
/ 07 октября 2009

К сожалению, нет пути. Из optparse документов :

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

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

2 голосов
/ 16 декабря 2011

Вы можете сделать необязательный параметр с помощью 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
0 голосов
/ 07 января 2015

Python Getopt должен действительно поддерживать необязательные аргументы, такие как GNU Getopt, требуя '=' использоваться при указании параметра. Теперь вы можете смоделировать это довольно легко, хотя, с этим ограничением путем неявного изменения --option на --option =

т.е. Вы можете указать, что --option требует аргумента, а затем настройте --option на --option = следующим образом:

for i, opt in enumerate(sys.argv):
    if opt == '--option':
        sys.argv[i] = '--option='
    elif opt == '--':
        break
0 голосов
/ 07 октября 2009

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

...