Ошибка: такой опции пока нет, я четко настроил - PullRequest
0 голосов
/ 23 апреля 2020

Я только начинаю с простого проекта и использую библиотеку Click и рано наткнулся на загадку, которую не могу понять. Когда я запускаю это с флагом «--testmode», он отображается как True, однако последующая функция не выполняется, и я получаю сообщение об ошибке, что такая опция не определена? Что я тут не так делаю?

import click

@click.command()
@click.option('--user', prompt=True)
@click.option('--password', prompt=True, hide_input=True, confirmation_prompt=False)
def authenticate(user, password):
    pass

@click.command()
@click.option('--age')
@click.option('--testmode', is_flag=True)
def main(age, testmode):
    print('Age: ', age)
    print('Testmode: ', testmode)

    if testmode:
        authenticate()

if __name__ == "__main__":
    main()

Вывод на консоль:

python .\dev.py --help
Usage: dev.py [OPTIONS]

Options:
  --age TEXT
  --testmode
  --help      Show this message and exit.


python .\dev.py --testmode
Age:  None
Testmode:  True
Usage: dev.py [OPTIONS]
Try 'dev.py --help' for help.

Error: no such option: --testmode

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

Проблема здесь:

    if testmode:
        authenticate()

Вы вызываете authenticate() как функцию, но вы определили ее как другую click.command. Это означает, что он собирается посмотреть на sys.argv для параметров командной строки, найти --testmode и сравнить его с опциями, которые вы определили с помощью @click.option.

Метод authenticate не имеет --testmode, следовательно, вы видите ошибку.

Существуют различные способы исправить это. authenticate действительно нужно настроить как команду? То, как вы сейчас настроили свой код, нет способа вызвать его из командной строки.

1 голос
/ 24 апреля 2020

Ответ Iarsks - это то, что вы ищете, но, чтобы уточнить это далее, в документации Click есть некоторая информация о вызове других команд. Поэтому, если вы действительно хотите, чтобы authenticate был настроен в качестве команды, у вас есть 2 варианта:

  1. Абстрагируйте logi c из authenticate в метод python, и вызовите это внутри authenticate и блока if testmode.

  2. Изучите вызов одной команды из другой. Команды щелчка имеют доступ к контексту, который является способом удержания щелчка, ссылающегося на текущую команду и другие команды. Дополнительную информацию можно найти здесь .

Для ясности контекст щелчка ctx может вызвать другую команду как таковую: ctx.invoke(authenticate, user=user_value, password=password_value).

Если текущая команда, которая была вызвана, имеет те же параметры и параметры, что и другая команда, которую вы хотите вызвать, click предлагает сокращение для нее: click.forward(authenticate), которая передаст те же аргументы команде authenticate.

...