Привет, мир в argparse
Следующая программа говорит привет пользователю. Он принимает один позиционный аргумент, имя пользователя, а также может быть сказано приветствие.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('name',
help='name of user'
)
parser.add_argument('-g', '--greeting',
default='Hello',
help='optional alternate greeting'
)
args = parser.parse_args()
print("{greeting}, {name}!".format(
greeting=args.greeting,
name=args.name)
)
$ python hello.py --help
usage: hello.py [-h] [-g GREETING] name
positional arguments:
name name of user
optional arguments:
-h, --help show this help message and exit
-g GREETING, --greeting GREETING
optional alternate greeting
$ python hello.py world
Hello, world!
$ python hello.py John -g Howdy
Howdy, John!
Для получения более подробной информации , пожалуйста , прочитайте argparse документацию .
Базовый пример с докоптом
docopt получается аргумент командной строки при разборе на голове. Вместо разбора аргументов, вы просто пишете строку использования для вашей программы, и docopt разбирает строку использования и использует его для извлечения аргументов командной строки.
"""
Usage:
script_name.py [-a] [-b] <path>
Options:
-a Print all the things.
-b Get more bees into the path.
"""
from docopt import docopt
if __name__ == "__main__":
args = docopt(__doc__)
import pprint; pprint.pprint(args)
Образцы прогонов:
$ python script_name.py
Usage:
script_name.py [-a] [-b] <path>
$ python script_name.py something
{'-a': False,
'-b': False,
'<path>': 'something'}
$ python script_name.py something -a
{'-a': True,
'-b': False,
'<path>': 'something'}
$ python script_name.py -b something -a
{'-a': True,
'-b': True,
'<path>': 'something'}
Установка взаимоисключающих аргументов с помощью argparse
Использование аргументов командной строки с argv
Всякий раз , когда скрипт Python вызывается из командной строки, пользователь может предоставить дополнительные аргументы командной строки , которые будут переданы на сценарий. Эти аргументы будут доступны для программиста от переменной системы sys.argv
( «ARGV» является традиционным названием используется в большинстве языков программирования, и это означает «ARG ument v Эктор»).
По соглашению, первый элемент в sys.argv
списке имя самого скрипта Python, в то время как остальные элементы являются лексемы , передаваемые пользователем при вызове сценария.
# cli.py
import sys
print(sys.argv)
$ python cli.py
=> ['cli.py']
$ python cli.py fizz
=> ['cli.py', 'fizz']
$ python cli.py fizz buzz
=> ['cli.py', 'fizz', 'buzz']
Вот еще один пример того , как использовать argv
.Сначала мы удаляем начальный элемент sys.argv, потому что он содержит имя скрипта. Затем мы объединяем остальные аргументы в одно предложение и, наконец, выводим это предложение, добавляя имя текущего пользователя, вошедшего в систему (чтобы оно имитировало программу чата).
import getpass
import sys
words = sys.argv[1:]
sentence = " ".join(words)
print("[%s] %s" % (getpass.getuser(), sentence))
Алгоритм обычно используется , когда «вручную» разбор числа не-позиционных аргументов перебрать sys.argv
списка. Один из способов - просмотреть список и вытолкнуть каждый его элемент:
# reverse and copy sys.argv
argv = reversed(sys.argv)
# extract the first element
arg = argv.pop()
# stop iterating when there's no more args to pop()
while len(argv) > 0:
if arg in('-f', '--foo'):
print('seen foo!')
elif arg in('-b', '--bar'):
print('seen bar!')
elif arg in('-a', '--with-arg'):
arg = arg.pop()
print('seen value: {}'.format(arg))
# get the next value
arg = argv.pop()
Пользовательское сообщение об ошибке парсера с argparse
Концептуальная группировка аргументов с помощью argparse.add_argument_group ()
Расширенный пример с docopt и docopt_dispatch
Как docopt, с [docopt_dispatch] вы ремесло ваш --help
в __doc__
переменной вашей точки входа модуля. Там, вы вызываете dispatch
с доком строкой в качестве аргумента, так что он может запустить анализатор над ним.
Это делается вместо того, чтобы вручную обрабатывать аргументы (которые обычно заканчиваются структурой if / else с высокой цикломатикой), вы оставляете это для диспетчеризации, давая только то, как вы хотите обработать набор аргументов.
Это то , что dispatch.on
декоратор для: вы даете ему аргумент или последовательность аргументов , которые должны вызвать функцию, и эта функция будет выполняться со значениями соответствия в качестве параметров.
"""Run something in development or production mode.
Usage: run.py --development <host> <port>
run.py --production <host> <port>
run.py items add <item>
run.py items delete <item>
"""
from docopt_dispatch import dispatch
@dispatch.on('--development')
def development(host, port, **kwargs):
print('in *development* mode')
@dispatch.on('--production')
def development(host, port, **kwargs):
print('in *production* mode')
@dispatch.on('items', 'add')
def items_add(item, **kwargs):
print('adding item...')
@dispatch.on('items', 'delete')
def items_delete(item, **kwargs):
print('deleting item...')
if __name__ == '__main__':
dispatch(__doc__)