Автор оригинала: 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']
Смотрите также
- стандартная библиотека документации для getopt
- argparse – модуль
argparse
заменяетgetopt
для более новых приложений.