Разбор аргументов командной строки

Привет, мир в 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__)