Рубрики
Без рубрики

getopt – Разбор параметров командной строки

Автор оригинала: Doug Hellmann.

Цель:

Разбор параметров командной строки

Модуль getopt – это исходный синтаксический анализатор параметров командной строки, который поддерживает соглашения, установленные функцией Unix getopt . Он анализирует последовательность аргументов, такую как sys.argv , и возвращает последовательность кортежей, содержащих пары (параметр, аргумент) и последовательность аргументов, не являющихся параметрами.

Синтаксис поддерживаемых опций включает краткие и длинные варианты формы:

-a
-bval
-b val
--noarg
--witharg val

Примечание

getopt не является устаревшим, но argparse более активно поддерживается и должен использоваться для новых разработок.

Аргументы функций

Функция getopt () принимает три аргумента:

  • Первый параметр – это последовательность анализируемых аргументов. Обычно это происходит из sys.argv [1:] (игнорируя имя программы в sys.arg [0] ).
  • Второй аргумент – это строка определения опции для односимвольных опций. Если для одного из вариантов требуется аргумент, после его буквы следует двоеточие.
  • Третий аргумент, если он используется, должен быть последовательностью длинных имен опций. Параметры длинного стиля могут содержать более одного символа, например --noarg или --witharg . Имена параметров в последовательности не должны включать префикс « - ». Если какой-либо длинный параметр требует аргумента, его имя должно иметь суффикс « ».

Варианты короткой и длинной формы можно комбинировать в одном вызове.

Параметры краткой формы

В этом примере программы можно использовать три варианта. -a – это простой флаг, а для -b и -c требуется аргумент. Строка определения параметра – "ab: c:" .

getopt_short.py

import getopt

opts, args  getopt.getopt(['-a', '-bval', '-c', 'val'], 'ab:c:')

for opt in opts:
    print(opt)

Программа передает список смоделированных значений параметров в getopt () , чтобы показать, как они обрабатываются.

$ python3 getopt_short.py

('-a', '')
('-b', 'val')
('-c', 'val')

Параметры длинной формы

Для программы, которая принимает два параметра, --noarg и --witharg , последовательность длинных аргументов должна быть ['noarg',] .

getopt_long.py

import getopt

opts, args  getopt.getopt(
    ['--noarg',
     '--witharg', 'val',
     

Поскольку этот пример программы не принимает никаких коротких параметров формы, второй аргумент getopt () – это пустая строка.

$ python3 getopt_long.py

('--noarg', '')
('--witharg', 'val')
('--witharg2', 'another')

Полный пример

Этот пример представляет собой более полную программу, которая принимает пять параметров: -o , -v , --output , --verbose и --version . Для каждого параметра -o , --output и --version требуется аргумент.

getopt_example.py

import getopt
import sys

version  '1.0'
verbose  False
output_filename  'default.out'

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

try:
    options, remainder  getopt.getopt(
        sys.argv[1:],
        'o:v',
        [,
         'verbose',
         ,
         ])
except getopt.GetoptError as err:
    print('ERROR:', err)
    sys.exit(1)

print('OPTIONS   :', options)

for opt, arg in options:
    if opt in ('-o', '--output'):
        output_filename  arg
    elif opt in ('-v', '--verbose'):
        verbose  True
    elif opt  '--version':
        version  arg

print('VERSION   :', version)
print('VERBOSE   :', verbose)
print('OUTPUT    :', output_filename)
print('REMAINING :', remainder)

Программа может вызываться разными способами. Когда он вызывается вообще без аргументов, используются настройки по умолчанию.

$ python3 getopt_example.py

ARGV      : []
OPTIONS   : []
VERSION   : 1.0
VERBOSE   : False
OUTPUT    : default.out
REMAINING : []

Однобуквенный вариант может быть отделен от аргумента пробелом.

$ python3 getopt_example.py -o foo

ARGV      : ['-o', 'foo']
OPTIONS   : [('-o', 'foo')]
VERSION   : 1.0
VERBOSE   : False
OUTPUT    : foo
REMAINING : []

Или параметр и значение можно объединить в один аргумент.

$ python3 getopt_example.py -ofoo

ARGV      : ['-ofoo']
OPTIONS   : [('-o', 'foo')]
VERSION   : 1.0
VERBOSE   : False
OUTPUT    : foo
REMAINING : []

Опция длинной формы аналогичным образом может быть отделена от значения.

$ python3 getopt_example.py --output foo

ARGV      : ['--output', 'foo']
OPTIONS   : [('--output', 'foo')]
VERSION   : 1.0
VERBOSE   : False
OUTPUT    : foo
REMAINING : []

Когда длинный параметр комбинируется с его значением, имя параметра и значение должны быть разделены одним .

$ python3 getopt_example.py

ARGV      :]
OPTIONS   : [('--output', 'foo')]
VERSION   : 1.0
VERBOSE   : False
OUTPUT    : foo
REMAINING : []

Сокращение параметров длинной формы

Параметр полной формы не обязательно указывать полностью в командной строке, если указан уникальный префикс.

$ python3 getopt_example.py --o foo

ARGV      : ['--o', 'foo']
OPTIONS   : [('--output', 'foo')]
VERSION   : 1.0
VERBOSE   : False
OUTPUT    : foo
REMAINING : []

Если уникальный префикс не указан, возникает исключение.

$ python3 getopt_example.py --ver 2.0

ARGV      : ['--ver', '2.0']
ERROR: option --ver not a unique prefix

Разбор опций в стиле GNU

Обычно обработка опций останавливается, как только встречается первый аргумент, не являющийся опцией.

$ python3 getopt_example.py -v not_an_option --output foo

ARGV      : ['-v', 'not_an_option', '--output', 'foo']
OPTIONS   : [('-v', '')]
VERSION   : 1.0
VERBOSE   : True
OUTPUT    : default.out
REMAINING : ['not_an_option', '--output', 'foo']

Чтобы смешивать аргументы параметров и аргументы без параметров в командной строке в любом порядке, используйте вместо этого gnu_getopt () .

getopt_gnu.py

import getopt
import sys

version  '1.0'
verbose  False
output_filename  'default.out'

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

try:
    options, remainder  getopt.gnu_getopt(
        sys.argv[1:],
        'o:v',
        [,
         'verbose',
         ,
         ])
except getopt.GetoptError as err:
    print('ERROR:', err)
    sys.exit(1)

print('OPTIONS   :', options)

for opt, arg in options:
    if opt in ('-o', '--output'):
        output_filename  arg
    elif opt in ('-v', '--verbose'):
        verbose  True
    elif opt  '--version':
        version  arg

print('VERSION   :', version)
print('VERBOSE   :', verbose)
print('OUTPUT    :', output_filename)
print('REMAINING :', remainder)

После изменения вызова в предыдущем примере разница становится очевидной.

$ python3 getopt_gnu.py -v not_an_option --output foo

ARGV      : ['-v', 'not_an_option', '--output', 'foo']
OPTIONS   : [('-v', ''), ('--output', 'foo')]
VERSION   : 1.0
VERBOSE   : True
OUTPUT    : foo
REMAINING : ['not_an_option']

Завершение обработки аргумента

Если getopt () встречает “ - ” во входных аргументах, он прекращает обработку оставшихся аргументов как параметров. Эта функция может использоваться для передачи значений аргументов, которые выглядят как параметры, например, имена файлов, начинающиеся с тире (“ - “).

$ python3 getopt_example.py -v -- --output foo

ARGV      : ['-v', '--', '--output', 'foo']
OPTIONS   : [('-v', '')]
VERSION   : 1.0
VERBOSE   : True
OUTPUT    : default.out
REMAINING : ['--output', 'foo']

Смотрите также