Как читать / обрабатывать аргументы командной строки?
Я изначально программист C. Я видел множество трюков и" хаков", чтобы прочитать много разных аргументов.
Каковы некоторые из способов, которыми программисты Python могут это сделать?
по теме
- каков наилучший способ захватить / проанализировать аргументы командной строки, переданные скрипту Python?
- реализация интерфейса командной строки в стиле" [command] [action] [parameter]"?
- как я могу обрабатывать аргументы командной строки в Python?
- как мне форматировать позиционный аргумент с помощью optparse Python?
17 ответов:
каноническое решение в стандартной библиотеке
argparse( docs):вот пример:
from argparse import ArgumentParser parser = ArgumentParser() parser.add_argument("-f", "--file", dest="filename", help="write report to FILE", metavar="FILE") parser.add_argument("-q", "--quiet", action="store_false", dest="verbose", default=True, help="don't print status messages to stdout") args = parser.parse_args()
argparseподдерживает (среди прочего):
- несколько вариантов в любом порядке.
- короткие и длинные варианты.
- значения по умолчанию.
- генерация сообщения справки по использованию.
import sys print("\n".join(sys.argv))
sys.argv- это список, содержащий все аргументы, переданные скрипту в командной строке.по сути,
import sys print(sys.argv[1:])
просто иду вокруг евангелизации для argparse что лучше для эти причинам.. по существу:
(скопировано по ссылке)
модуль argparse может обрабатывать позиционные и необязательные аргументы, в то время как optparse может обрабатывать только по желанию аргументы
argparse не догматичен что ваш интерфейс командной строки должно выглядеть как-параметры как-файл или / файл есть поддерживается, как есть обязательные опции. Optparse отказывается поддержите эти особенности, предпочитая чистота над практичностью
argparse производит больше информационные сообщения об использовании, в том числе использование командной строки определяется из ваши аргументы и сообщения справки для как позиционные, так и необязательным аргументы. Модуль optparse необходимо написать собственное использование строка, и не имеет способа отображения помощь для позиционных аргументов.
поддержка argparse действие, которое потребляйте переменное количество аргументы командной строки, в то время как optparse требуется, чтобы точное количество аргументы (например, 1, 2 или 3) должны быть известны заранее
argparse поддерживает Парсеры отправка в суб-команды, в то время как optparse требует настройки
allow_interspersed_argsи делать парсер отправка вручнуюи мой личный фаворит:
- argparse позволяет тип и параметры действия до
add_argument()уточняется с помощью простой callables, в то время как optparse требует взлом атрибутов класса, таких какSTORE_ACTIONSилиCHECK_METHODSполучить правильная проверка аргументов
есть еще
argparseмодуль stdlib ("impovement" на stdliboptparseмодуль). Пример из введение в argparse:# script.py import argparse if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument( 'integers', metavar='int', type=int, choices=range(10), nargs='+', help='an integer in the range 0..9') parser.add_argument( '--sum', dest='accumulate', action='store_const', const=sum, default=max, help='sum the integers (default: find the max)') args = parser.parse_args() print(args.accumulate(args.integers))использование:
$ script.py 1 2 3 4 4 $ script.py --sum 1 2 3 4 10
один из способов сделать это с помощью
sys.argv. Это выведет имя скрипта в качестве первого аргумента и все остальные параметры, которые вы передадите ему.import sys for arg in sys.argv: print arg
на docopt библиотека действительно ловкач. Он создает аргумент dict из строки использования для вашего приложения.
например, из docopt readme:
"""Naval Fate. Usage: naval_fate.py ship new <name>... naval_fate.py ship <name> move <x> <y> [--speed=<kn>] naval_fate.py ship shoot <x> <y> naval_fate.py mine (set|remove) <x> <y> [--moored | --drifting] naval_fate.py (-h | --help) naval_fate.py --version Options: -h --help Show this screen. --version Show version. --speed=<kn> Speed in knots [default: 10]. --moored Moored (anchored) mine. --drifting Drifting mine. """ from docopt import docopt if __name__ == '__main__': arguments = docopt(__doc__, version='Naval Fate 2.0') print(arguments)
Если вам нужно что-то быстрое и не очень гибкое
main.py:
import sys first_name = sys.argv[1] last_name = sys.argv[2] print("Hello " + first_name + " " + last_name)затем запустите
python main.py James Smithдля получения следующих выходных данных:
Привет Джеймс Смит
Я использую optparse сам, но очень нравится направление Саймон Уиллисон принимает с его недавно введенным optfunc библиотека. Он работает:
" интроспекция функции определение (включая его аргументы и их значения по умолчанию) и использование чтобы построить командную строку парсер аргументов."
Так, например, это определение функции:
def geocode(s, api_key='', geocoder='google', list_geocoders=False):превращается в эту справку optparse текст:
Options: -h, --help show this help message and exit -l, --list-geocoders -a API_KEY, --api-key=API_KEY -g GEOCODER, --geocoder=GEOCODER
Мне нравится getopt от stdlib, например:
try: opts, args = getopt.getopt(sys.argv[1:], 'h', ['help']) except getopt.GetoptError, err: usage(err) for opt, arg in opts: if opt in ('-h', '--help'): usage() if len(args) != 1: usage("specify thing...")в последнее время я обертываю что-то похожее на это, чтобы сделать вещи менее подробными (например, сделать "- h" неявным).
Pocoo это клик является более интуитивным, требует меньше шаблонных и, по крайней мере, такой же мощный, как argparse.
единственная слабость, с которой я столкнулся до сих пор, заключается в том, что вы не можете сделать много настроек, чтобы помочь страницам, но это обычно не является требованием и docopt Кажется, что ясный выбор, когда это так.
вас может заинтересовать небольшой модуль Python, который я написал, чтобы сделать обработку аргументов командной строки еще проще (с открытым исходным кодом и бесплатно использовать) -диверсант
Я рекомендую посмотреть на docopt как простая альтернатива этим другим.
docopt-это новый проект, который работает путем разбора вашего сообщения об использовании --help, а не требует от вас реализовать все самостоятельно. Вам просто нужно поместить сообщение об использовании в формат POSIX.
еще один вариант argh. Он основан на argparse и позволяет писать такие вещи, как:
import argh # declaring: def echo(text): "Returns given word as is." return text def greet(name, greeting='Hello'): "Greets the user with given name. The greeting is customizable." return greeting + ', ' + name # assembling: parser = argh.ArghParser() parser.add_commands([echo, greet]) # dispatching: if __name__ == '__main__': parser.dispatch()он автоматически генерирует справку и т. д., И вы можете использовать декораторы для предоставления дополнительных указаний о том, как должен работать arg-parsing.
import argparse parser = argparse.ArgumentParser(description='Process some integers.') parser.add_argument('integers', metavar='N', type=int, nargs='+', help='an integer for the accumulator') parser.add_argument('--sum', dest='accumulate', action='store_const', const=sum, default=max, help='sum the integers (default: find the max)') args = parser.parse_args() print(args.accumulate(args.integers)) Assuming the Python code above is saved into a file called prog.py $ python prog.py -h Ref-link: https://docs.python.org/3.3/library/argparse.html
мое решение-это entrypoint2. Пример:
from entrypoint2 import entrypoint @entrypoint def add(file, quiet=True): ''' This function writes report. :param file: write report to FILE :param quiet: don't print status messages to stdout ''' print file,quietпомогите текст:
usage: report.py [-h] [-q] [--debug] file This function writes report. positional arguments: file write report to FILE optional arguments: -h, --help show this help message and exit -q, --quiet don't print status messages to stdout --debug set logging level to DEBUG
Comments