Как я могу обработать аргументы командной строки в 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
... первый - из-за более чем одного "числового" аргумента; второе - из-за... ну, неожиданных аргументов; третий и четвертый - из-за не трехзначных аргументов.
5 ответов
Как ответили другие, 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
,
Если вы хотите реализовать фактические ключи командной строки, посмотрите 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.