Докопт экстремально не интуитивное использование опионов

Докопт любит писать много документации, и я не могу найти ни одного фактического вызова командной строки на их многих страницах о том, как писать раздел комментариев. У меня есть этот очень простой файл:

"""Main.py
Usage:
  main.py controller
  main.py model
  main.py form
  main.py -h | --help
  main.py --version
Options:
  -h --help     Show this screen.
  --version     Show version.
  --outfile     Output file.
"""
from docopt import docopt


if __name__ == '__main__':
    arguments = docopt(__doc__, version='Main.py 1.0')
    print(arguments)

Я получаю первую часть:

adams-mbp:Aut adam$ python main.py model
{'--help': 0,
 '--outfile': None,
 '--version': 0,
 'Options:': False,
 'Show': 0,
 'controller': False,
 'file.': False,
 'form': False,
 'model': True,
 'screen.': False,
 'this': False,
 'version.': False}

Но я не могу понять, как пройти --outfile параметр. Вот что я попробовал:

adams-mbp:Aut adam$ python main.py main.py --outfile thing
Usage:
  main.py controller
  main.py model
  main.py form
  main.py -h | --help
  main.py --version
Options:
  -h --help     Show this screen.
  --version     Show version.
  --outfile     Output file.

adams-mbp:Aut adam$ python main.py main.py --outfile=thing
Usage:
  main.py controller
  main.py model
  main.py form
  main.py -h | --help
  main.py --version
Options:
  -h --help     Show this screen.
  --version     Show version.
  --outfile     Output file.

adams-mbp:Aut adam$ python --outfile thing main.py main.py
Unknown option: --
usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ...
Try `python -h' for more information.

adams-mbp:Aut adam$ python --outfile=thing main.py main.py
Unknown option: --
usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ...
Try `python -h' for more information.

adams-mbp:Aut adam$ python main.py main.py -outfile thing
Usage:
  main.py controller
  main.py model
  main.py form
  main.py -h | --help
  main.py --version
Options:
  -h --help     Show this screen.
  --version     Show version.
  --outfile     Output file.

adams-mbp:Aut adam$ python main.py main.py -outfile=thing
Naval Fate.
Usage:
  main.py controller
  main.py model
  main.py form
  main.py -h | --help
  main.py --version
Options:
  -h --help     Show this screen.
  --version     Show version.
  --outfile         Output file.

adams-mbp:Aut adam$ python main.py main.py outfile=thing
Usage:
  main.py controller
  main.py model
  main.py form
  main.py -h | --help
  main.py --version
Options:
  -h --help     Show this screen.
  --version     Show version.
  --outfile     Output file.

Шутки в сторону?

1 ответ

Прежде всего, почему вы вызываете свой сценарий дважды?

python main.py main.py --outfile thing  # Will not work
python main.py --outfile thing  # This will be enough

Во-вторых, раздел использования docopt покажет вам другой способ вызова вашего скрипта.

Usage:
  main.py controller
  main.py model
  main.py form
  main.py -h | --help
  main.py --version

main.py model работать, потому что это описано здесь. Но --outfile в этом разделе "Использование" нигде не фигурирует, поэтому docopt считает это ложным вводом И именно поэтому скрипт всегда возвращает помощь.

Если вы хотите использовать эту опцию, вы должны описать ее в разделе "Использование".

Вы можете сделать это так:

Usage:
  main.py controller
  main.py model [--outfile]

Скобка говорит, что опция не обязательна, используйте () для обязательных опций.

Еще один момент, даже если вы в первый раз вызвали шоу, options не должно появляться в словаре, может быть, вы должны оставить пробел в документации. ни screen, или же this. и так далее... Попробуйте что-то вроде этого:

"""Main.py

Usage:
    main.py controller [--outfile]
    main.py model [--outfile]
    main.py form [--outfile]
    main.py (-h | --help)
    main.py --version

Options:
    -h, --help     Show this screen.
    --version      Show version.
    --outfile      Output file.
"""
from docopt import docopt


if __name__ == '__main__':
    arguments = docopt(__doc__, version='Main.py 1.0')
    print(arguments)
Другие вопросы по тегам