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

Что было бы легким выражением для обработки аргументов командной строки, если я ожидаю что-то вроде 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-значных аргументов.

Ответ 1

Как и другие, 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'

EDIT. Здесь приведен пример 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()

Ответ 2

Посмотрите модуль optparse. Работа с sys.argv сама по себе хороша для действительно простых вещей, но она быстро выходит из рук.

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

Ответ 3

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

Ответ 4

Если вы хотите реализовать фактические ключи командной строки, откройте getopt. Это невероятно простое в использовании.

Ответ 5

Ван Гейл в значительной степени правилен в использовании регулярного выражения против аргумента. Однако НЕОБХОДИМО сделать все возможное при использовании 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.