Python 2,7. Разбор входных параметров - PullRequest
0 голосов
/ 20 февраля 2020

Доброе время суток! Прежде всего, позвольте мне сказать, что я новичок ie в Python мире. У меня проблемы с анализом входных параметров. На данный момент я использую Python 2.7 и модуль, который называется argparse. Я пытаюсь разработать простое приложение, которое сможет анализировать простые входные параметры. Вот краткий пример:

my_app.py syn c --force

Второй пример:

my_app.py patch --branch

Я вижу, что для этого я могу использовать add_argument, который может работать с позиционными и необязательными аргументами. Как и в моем случае, я хочу иметь несколько позиционных (но необязательных одновременно) и несколько необязательных аргументов. Для этого я разработал небольшой скрипт

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='My App')
    parser.add_argument('sync', type=bool, const=True, nargs='?')
    parser.add_argument('-f', '--force', dest='sync_force', type=bool, const=True, nargs='?')
    parser.add_argument('-b', '--branch', type=str, const=True, nargs='?')
    parser.add_argument('-u', '--url', type=str, const=True, nargs='?')
    parser.add_argument('patch', type=bool, const=True, nargs='?')
    parser.add_argument('revert', type=bool, const=True, nargs='?')
    parser.add_argument('verify', type=bool, const=True, nargs='?')

    values = parser.parse_args()

    if values.revert:
        handler.revert()
    else:
        parser.print_help()

. Я вижу, что могу использовать nargs='?', чтобы указать позиционный параметр как необязательный, но каждый раз, когда я вызываю свой скрипт, он показывает, что получил ' syn c' в качестве входного параметра, даже если я указал ' patch '. Итак, я думаю, что это показывает только первый добавленный элемент. Не могли бы вы сказать мне, что не так и в чем проблема?

Обновление: Я пытаюсь создать ситуацию, когда у меня будет возможность иметь только один позиционный аргумент одновременно ( и хотя бы один, но с любыми дополнительными необязательными параметрами). Например,

my_app.py syn c

my_app.py path

my_app.py verify --force

my_app.pyrevert - филиал

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

argparse имеет встроенную поддержку подкоманд .

Адаптация из вышеприведенной документации

parser = argparse.ArgumentParser()
parser.add_argument('--foo')
subparsers = parser.add_subparsers()
sync_parser = subparsers.add_parser('sync')
patch_parser = subparsers.add_parser('patch')
revert_parser = subparsers.add_parser('revert')
verify_parser = subparsers.add_parser('verify')

et c. это, вероятно, то, что вы ищете.

Кроме того, я могу рекомендовать только библиотеку Click для более удобного интерфейса для CLI.

0 голосов
/ 20 февраля 2020

С:

import argparse

if __name__ == '__main__':

    parser = argparse.ArgumentParser(description='My App')
    parser.add_argument('cmd', choices=['sync','patch', 'revert','verify'])
    parser.add_argument('-f', '--force', action='store_true')
    parser.add_argument('-b', '--branch')
    parser.add_argument('-u', '--url')

    args = parser.parse_args()
    print(args)
    if args.cmd in ['revert']:
        print('handler.revert()')
    else:
        parser.print_help()

тестирование

1243:~/mypy$ python stack60327766.py 
usage: stack60327766.py [-h] [-f] [-b BRANCH] [-u URL]
                        {sync,patch,revert,verify}
stack60327766.py: error: too few arguments
1244:~/mypy$ python stack60327766.py revert
Namespace(branch=None, cmd='revert', force=False, url=None)
handler.revert()
1244:~/mypy$ python stack60327766.py revert -f -b foobar -u aurl
Namespace(branch='foobar', cmd='revert', force=True, url='aurl')
handler.revert()
1244:~/mypy$ python stack60327766.py verify-f -b foobar -u aurl
usage: stack60327766.py [-h] [-f] [-b BRANCH] [-u URL]
                        {sync,patch,revert,verify}
stack60327766.py: error: argument cmd: invalid choice: 'verify-f' (choose from 'sync', 'patch', 'revert', 'verify')
1245:~/mypy$ python stack60327766.py verify -f -b foobar -u aurl
Namespace(branch='foobar', cmd='verify', force=True, url='aurl')
usage: stack60327766.py [-h] [-f] [-b BRANCH] [-u URL]
                        {sync,patch,revert,verify}

My App

positional arguments:
  {sync,patch,revert,verify}

optional arguments:
  -h, --help            show this help message and exit
  -f, --force
  -b BRANCH, --branch BRANCH
  -u URL, --url URL
...