Getopt.getopt: примеры (PYTHON)

Python функция getopt.getopt: руководство с примерами
Раздел: Аргументы командной строки, Парсинг
getopt.getopt(args: list, shortopts: str, longopts: list = []): list

Описание функции getopt.getopt

Функция getopt.getopt() из модуля getopt предоставляет инструмент для разбора аргументов командной строки. Она применяется в консольных приложениях для обработки переданных параметров.

Основные аргументы функции:

  • args - список строк аргументов (обычно sys.argv[1:]).
  • shortopts - строка с однобуквенными параметрами. Параметр, требующий значения, обозначается двоеточием (:) после символа.
  • longopts - список строк с длинными параметрами. Параметр, требующий значения, завершается символом равенства (=).

Функция возвращает кортеж из двух элементов:

  1. Список пар (параметр, значение) для успешно обработанных аргументов.
  2. Список оставшихся аргументов, не являющихся параметрами.

При возникновении ошибки разбора функция генерирует исключения GetoptError или error.

Базовые примеры использования

Пример с короткими параметрами:

import getopt, sys

args = ['-a', '-b', 'value_b', '-c', 'остаток']
shortopts = 'ab:c'
try:
    opts, args = getopt.getopt(args, shortopts)
    print('Опции:', opts)
    print('Аргументы:', args)
except getopt.GetoptError as e:
    print('Ошибка:', e)
Опции: [('-a', ''), ('-b', 'value_b'), ('-c', '')]
Аргументы: ['остаток']

Пример с длинными параметрами:

args = ['--input', 'file.txt', '--verbose', 'арг1']
longopts = ['input=', 'verbose']
try:
    opts, args = getopt.getopt(args, '', longopts)
    print('Опции:', opts)
    print('Аргументы:', args)
except getopt.GetoptError as e:
    print('Ошибка:', e)
Опции: [('--input', 'file.txt'), ('--verbose', '')]
Аргументы: ['арг1']

Альтернативы в Python

В Python существуют другие модули для разбора аргументов:

  • argparse - современный и мощный модуль, рекомендуется для новых проектов. Поддерживает проверки, подкоманды, справку.
  • optparse - устаревший модуль (не развивается с Python 2.7).
  • sys.argv - ручной разбор, подходит для простейших случаев.

Модуль getopt удобен для поддержки кода, написанного в стиле C, или для простых скриптов.

Аналоги в других языках

Пример на JavaScript (Node.js):

// process.argv содержит аргументы
const args = process.argv.slice(2);
let options = {};
for(let i = 0; i < args.length; i++) {
    if(args[i].startsWith('--')) {
        options[args[i].slice(2)] = args[i+1];
        i++;
    }
}
console.log(options);
// Запуск: node script.js --file test.txt
// Вывод: { file: 'test.txt' }
{ file: 'test.txt' }

Пример на PHP:

// $argv содержит аргументы
$options = getopt('f:', ['file:']);
print_r($options);
// Запуск: php script.php -f test.txt --file=test2.txt
// Вывод: Array ( [f] => test.txt [file] => test2.txt )
Array ( [f] => test.txt [file] => test2.txt )

Пример на Java (библиотека Apache Commons CLI):

import org.apache.commons.cli.*;

Options options = new Options();
options.addOption('f', 'file', true, 'имя файла');
CommandLineParser parser = new DefaultParser();
CommandLine cmd = parser.parse(options, args);
System.out.println(cmd.getOptionValue('f'));
// Запуск: java App -f test.txt
// Вывод: test.txt
test.txt

Типичные ошибки

Ошибка при отсутствии обязательного значения:

import getopt

try:
    opts, args = getopt.getopt(['-a'], 'a:')
except getopt.GetoptError as e:
    print('Ошибка:', e)
Ошибка: option -a requires argument

Ошибка при неизвестной опции:

try:
    opts, args = getopt.getopt(['-x'], 'a')
except getopt.GetoptError as e:
    print('Ошибка:', e)
Ошибка: option -x not recognized

Неправильный формат длинной опции:

try:
    opts, args = getopt.getopt(['--input=file.txt'], '', ['input'])
except getopt.GetoptError as e:
    print('Ошибка:', e)
Ошибка: option --input not recognized

Изменения в последних версиях

Функция getopt.getopt() остаётся стабильной, без значительных изменений. В Python 3.7 была добавлена пометка модуля как устаревшего в документации в пользу argparse, но сам модуль продолжает работу.

Расширенные примеры

Пример с обработкой смешанных аргументов:

Пример python
import getopt

args = ['-v', '--output', 'result.txt', 'file1', '-d', 'file2']
shortopts = 'vd:'
longopts = ['output=', 'verbose']
opts, remaining = getopt.getopt(args, shortopts, longopts)

print('Опции:')
for opt, val in opts:
    print(f'  {opt} -> {val}')
print('Оставшиеся аргументы:', remaining)
Опции:
  -v -> 
  --output -> result.txt
  -d -> file2
Оставшиеся аргументы: ['file1']

Пример с игнорированием первой ошибки:

Пример python
import getopt

class IgnoringGetoptError(getopt.GetoptError):
    pass

def getopt_ignore(args, shortopts, longopts=[]):
    opts = []
    while args:
        try:
            o, a = getopt.getopt(args, shortopts, longopts)
            opts.extend(o)
            break
        except getopt.GetoptError as e:
            opts.append(('unknown', args[0]))
            args = args[1:]
    return opts, args

result = getopt_ignore(['-a', '-x', '-b', 'value'], 'ab:')
print('Результат:', result)
Результат: ([('-a', ''), ('unknown', '-x'), ('-b', 'value')], [])

Пример с обработкой параметров без разделителя:

Пример python
args = ['-abc', 'arg1']
opts, remaining = getopt.getopt(args, 'ab:c')
print('Опции:', opts)
print('Остальное:', remaining)
Опции: [('-a', ''), ('-b', 'c')]
Остальное: ['arg1']

питон getopt.getopt function comments

En
Getopt.getopt Parse command line options and parameter list