Как я могу обработать аргументы командной строки в Python?

StackOverflow https://stackoverflow.com/questions/567879

Вопрос

Каким было бы простое выражение для обработки аргументов командной строки, если я ожидаю чего-то вроде 001 или 999 (давайте на этот раз ограничим ожидания диапазоном 001 ... 999), и передано несколько других аргументов, и хотелось бы игнорировать любые неожиданности?

Я понимаю, если, например, мне нужно выяснить, было ли передано "debug" среди параметров, это будет что-то вроде этого:

if 'debug' in argv[1:]:
  print 'Will be running in debug mode.'

Как узнать, был ли передан номер 009 или 575?

Все это ожидаемые звонки:

python script.py
python script.py 011
python script.py 256 debug
python script.py 391 xls
python script.py 999 debug pdf

На данный момент меня не волнуют подобные звонки:

python script.py 001 002 245 568
python script.py some unexpected argument
python script.py 0001
python script.py 02

...первый - из -за более чем одного "числового" аргумента;второе - из-за...что ж, неожиданные аргументы;третий и четвертый - из-за аргументов, не состоящих из 3 цифр.

Это было полезно?

Решение

Как ответили другие, optparse - лучший вариант, но если вам просто нужен быстрый код, попробуйте что-то вроде этого:

import sys, re

first_re = re.compile(r'^\d{3}$')

if len(sys.argv) > 1:

    if first_re.match(sys.argv[1]):
        print "Primary argument is : ", sys.argv[1]
    else:
        raise ValueError("First argument should be ...")

    args = sys.argv[2:]

else:

    args = ()

# ... anywhere in code ...

if 'debug' in args:
    print 'debug flag'

if 'xls' in args:
    print 'xls flag'

Редактировать:Вот пример optparse, потому что очень много людей отвечают на optparse, толком не объясняя, почему или что вам нужно изменить, чтобы он заработал.

Основная причина использования optparse заключается в том, что он дает вам больше гибкости для последующего расширения и предоставляет вам больше гибкости в командной строке.Другими словами, ваши опции могут отображаться в любом порядке, а сообщения об использовании генерируются автоматически.Однако, чтобы заставить его работать с optparse, вам нужно изменить свои спецификации, чтобы поместить '-' или '--' перед необязательными аргументами, и вам нужно разрешить всем аргументам располагаться в любом порядке.

Итак, вот пример использования optparse:

import sys, re, optparse

first_re = re.compile(r'^\d{3}$')

parser = optparse.OptionParser()
parser.set_defaults(debug=False,xls=False)
parser.add_option('--debug', action='store_true', dest='debug')
parser.add_option('--xls', action='store_true', dest='xls')
(options, args) = parser.parse_args()

if len(args) == 1:
    if first_re.match(args[0]):
        print "Primary argument is : ", args[0]
    else:
        raise ValueError("First argument should be ...")
elif len(args) > 1:
    raise ValueError("Too many command line arguments")

if options.debug:
    print 'debug flag'

if options.xls:
    print 'xls flag'

Различия здесь с optparse и вашей спецификацией заключаются в том, что теперь вы можете использовать командные строки, такие как:

python script.py --debug --xls 001

и вы можете легко добавить новые параметры, вызвав parser.add_option()

Другие советы

Взгляните на optparse ( выборочный анализ ) модуль.Самостоятельная работа с sys.argv хороша для действительно простых вещей, но она быстро выходит из-под контроля.

Обратите внимание, что, возможно, вам будет проще использовать optparse, если вы сможете немного изменить формат аргумента;например ,заменить debug с --debug и xls с --xls или --output=xls.

optparse ( выборочный анализ ) это ваш лучший друг для разбора командной строки.Также загляните в argparse ( аргумент );однако этого нет в стандартной библиотеке.

Если вы хотите реализовать реальные параметры командной строки, укажите getopt ( получить ) взгляд.К тому же он невероятно прост в использовании.

Ван Гейл в значительной степени прав, используя регулярное выражение против аргумента.Однако НЕТ абсолютной необходимости делать все опцией при использовании optparse, который разбивает sys.argv на опции и аргументы в зависимости от того, находится "-" или "--" впереди или нет.Какой-нибудь пример кода для просмотра только аргументов:

import sys
import optparse

claParser = optparse.OptionParser()
claParser.add_option(
(opts, args) = claParser.parse_args()
if (len(args) >= 1):
  print "Arguments:"
  for arg in args:
    print "  " + arg
else:
  print "No arguments"
sys.exit(0)

Да, массив args анализируется почти так же, как и sys.argv, но была добавлена возможность легко добавлять параметры при необходимости.Для получения дополнительной информации о optparse ознакомьтесь с соответствующий документ Python.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top