Как отладить приложение Python для клика?
Я создал приложение cli, используя библиотеку click в python. Нет документации по отладке команд.
Без щелчка легко отлаживать файлы python в IDE, но когда мы используем щелчок, команды должны быть запущены через установку console_scripts в setup.py.
3 ответа
Это плохо документировано, но вы можете напрямую вызывать командные функции и, таким образом, запускать код в отладчике:
Образец кода:
import click
@click.command()
@click.option('--my_arg', default=1, help='a number')
def my_command(my_arg):
click.echo("my_arg='%d'" % my_arg)
if __name__ == '__main__':
my_command(['--my_arg', '3'])
Результат:
my_arg='3'
Я опаздываю на вечеринку на пару лет, но на случай, если кто-то еще придет сюда в поисках ответа, как я только что:
Вызов функции с помощью CliRunner.invoke() вернет объект "Результат" с атрибутом "exc_info". Вы можете передать это в traceback.print_exception() следующим образом:
runner = CliRunner()
result = runner.invoke(my_command)
traceback.print_exception(*result.exc_info)
Setup.py генерирует:
- console_script.exe
- console_script-script.py
из cmdline:
console_app --help
расширяется до конфигурации IDE cmd:
python <absolute path to>\console_app-script.py --help
Протестировано в PyCharm 2018.2 - вы можете устанавливать и нажимать точки останова и сохранять ожидаемую парадигму cmdline/arg.
Я обнаружил, что написание тестов - отличный способ отладки приложений Click CLI: http://click.pocoo.org/5/testing/
Начните очень просто с вашей функции и теста, затем добавьте к нему, убедившись, что тест говорит вам, что вам нужно...
Также, установка значений по умолчанию помогает:
def run_files (input_file = '/ path / to / input_file', output_file = '/ path / to / output_file'): click.echo (input_file, output_file)
Я также обычно настраиваю регистрацию и регистрирую все, когда я начинаю:
logging.basicConfig(format='%(levelname)s %(message)s', level=logging.DEBUG)
Затем разбросайте их по всему (в IU есть утилиты с метками времени, но это не обязательно):
logging.info('[{0}] Blah blah selected...'.format(
utils.get_timestamp()))
Вы можете сделать это с print
или же click.echo
тоже.
Вы можете использовать pdb так, вставив код, который хотите отлаживать:
import pdb
pdb.set_trace()
Например:
import click
@click.command()
def hello():
msg = "hi"
num = 3
import pdb
pdb.set_trace()
click.echo('Hello1!')
click.echo('Hello2!')
click.echo(msg + num)
if __name__ == '__main__':
hello()
Затем вы можете использовать pdb:
$ python hello.py
> /home/eduardo/w/ifpb/cozer/hello.py(11)hello()
-> click.echo('Hello1!')
(Pdb) msg
'hi'
(Pdb) num
3
(Pdb) msg = hello
(Pdb) b 13
Breakpoint 1 at /home/eduardo/w/ifpb/cozer/hello.py:13
(Pdb) c
Hello1!
Hello2!
> /home/eduardo/w/ifpb/cozer/hello.py(13)hello()
-> click.echo(msg + num)
(Pdb) c
Traceback (most recent call last):
File "hello.py", line 16, in <module>
hello()
File "/home/eduardo/w/ifpb/cozer/venv/lib/python3.5/site-packages/click/core.py", line 764, in __call__
return self.main(*args, **kwargs)
File "/home/eduardo/w/ifpb/cozer/venv/lib/python3.5/site-packages/click/core.py", line 717, in main
rv = self.invoke(ctx)
File "/home/eduardo/w/ifpb/cozer/venv/lib/python3.5/site-packages/click/core.py", line 956, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/home/eduardo/w/ifpb/cozer/venv/lib/python3.5/site-packages/click/core.py", line 555, in invoke
return callback(*args, **kwargs)
File "hello.py", line 13, in hello
click.echo(msg + num)
TypeError: unsupported operand type(s) for +: 'Command' and 'int'
После ошибки мы можем попробовать еще раз решение:
$ python hello.py
> /home/eduardo/w/ifpb/cozer/hello.py(11)hello()
-> click.echo('Hello1!')
(Pdb) msg
'hi'
(Pdb) num
3
(Pdb) b 13
Breakpoint 1 at /home/eduardo/w/ifpb/cozer/hello.py:13
(Pdb) c
Hello1!
Hello2!
> /home/eduardo/w/ifpb/cozer/hello.py(13)hello()
-> click.echo(msg + num)
(Pdb) num = str(num)
(Pdb) c
hi3
Если вы ищете для отладки модулей / классов, которые выполняются после щелчка командных функций.
Доступным решением является создание сценария, который имитирует поток, выполняемый после выполнения команды.
Затем, поместив точки отладки в требуемые строки, вы сможете достичь функциональности отладки.
Это то, что я решил сделать после короткого поиска в Интернете.