Используйте аргумент standalone_mode
, попробуйте следующее:
rv = cli(obj={}, standalone_mode=False)
При сбое синтаксического анализа приведенный выше код выдаст UsageError
.Когда --help
было пройдено, rv
будет целым числом 0
.В большинстве других случаев возвращается возвращаемое значение функции, которая обрабатывает команду, хотя есть множество исключений, и поведение в целом довольно сложное, здесь больше объяснений: https://click.palletsprojects.com/en/master/commands/#command-return-values
Преимущество этогоПодход заключается в том, что вы можете использовать возвращаемые значения из обработчиков команд.Недостатком является то, что вы теряете симпатичное печатное сообщение справки при сбое анализа (может быть, есть способ восстановить его?).
Другой вариант - не использовать standalone_mode
и вместо этого обернуть ваш вызов cli
в блоке try/except
, в котором вы ловите SystemExit
:
try:
cli(obj={})
except SystemExit as e:
if e.code != 0:
raise
Набрав SystemExit
, вы можете остановить процесс выхода из программы, инициированный щелчком.Если команда успешно проанализирована, то SystemExit(0)
перехватывается.Еще раз обратите внимание, что синтаксический анализ --help
также считается «успешным» анализом и, следовательно, также возвращает SystemExit(0)
.
. Недостатком этого подхода является то, что вы не можете использовать возвращаемое значение обработчика команды, что делаеттруднее узнать, когда был принят --help
.Положительным моментом является то, что все сообщения справки для консоли восстанавливаются.
Следует также отметить, что SystemExit
наследуется от BaseException
, но не от Exception
.Таким образом, чтобы поймать SystemExit
, вы можете либо поймать его напрямую, либо поймать BaseException
.