Как я могу обработать аргументы командной строки в Python?
-
05-09-2019 - |
Вопрос
Каким было бы простое выражение для обработки аргументов командной строки, если я ожидаю чего-то вроде 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.