Getopt.getopt: примеры (PYTHON)
getopt.getopt(args: list, shortopts: str, longopts: list = []): listОписание функции getopt.getopt
Функция getopt.getopt() из модуля getopt предоставляет инструмент для разбора аргументов командной строки. Она применяется в консольных приложениях для обработки переданных параметров.
Основные аргументы функции:
- args - список строк аргументов (обычно
sys.argv[1:]). - shortopts - строка с однобуквенными параметрами. Параметр, требующий значения, обозначается двоеточием (
:) после символа. - longopts - список строк с длинными параметрами. Параметр, требующий значения, завершается символом равенства (
=).
Функция возвращает кортеж из двух элементов:
- Список пар
(параметр, значение)для успешно обработанных аргументов. - Список оставшихся аргументов, не являющихся параметрами.
При возникновении ошибки разбора функция генерирует исключения 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.txttest.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, но сам модуль продолжает работу.
Расширенные примеры
Пример с обработкой смешанных аргументов:
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']
Пример с игнорированием первой ошибки:
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')], [])Пример с обработкой параметров без разделителя:
args = ['-abc', 'arg1']
opts, remaining = getopt.getopt(args, 'ab:c')
print('Опции:', opts)
print('Остальное:', remaining)Опции: [('-a', ''), ('-b', 'c')]
Остальное: ['arg1']