Как отладить приложение 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

Если вы ищете для отладки модулей / классов, которые выполняются после щелчка командных функций.

Доступным решением является создание сценария, который имитирует поток, выполняемый после выполнения команды.

Затем, поместив точки отладки в требуемые строки, вы сможете достичь функциональности отладки.

Это то, что я решил сделать после короткого поиска в Интернете.

Другие вопросы по тегам