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

Введение

Примеры

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

Синтаксис

Параметры

Примечания