如何调试python单击cli应用程序?

时间:2017-03-30 10:51:15

标签: python python-3.x python-click

我在python中使用click library构建了一个cli应用程序。没有关于如何调试命令的文档。

没有单击,它很容易在IDE中调试python文件,但是当我们使用click时,需要通过setup.py中的console_scripts安装程序运行这些命令。

6 个答案:

答案 0 :(得分:8)

这没有详细记录,但您可以直接调用命令函数,从而可以在调试器中运行代码:

示例代码:

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'

答案 1 :(得分:1)

我发现编写测试是调试Click CLI应用程序的好方法:http://click.pocoo.org/5/testing/

使用您的功能和测试开始非常简单,然后添加到它,确保测试告诉您需要它...

此外,设置默认值有助于:

def run_files(input_file ='/ path / to / input_file',               OUTPUT_FILE = '/路径/到/ 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()))

您也可以使用printclick.echo执行此操作。

答案 2 :(得分:1)

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范例。

答案 3 :(得分:0)

您可以像这样使用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

答案 4 :(得分:0)

我参加聚会晚了几年,但万一其他人来这里寻找答案,就像我刚才所做的那样:

使用CliRunner.invoke()调用函数将返回带有“ exc_info”属性的“结果”对象。您可以像这样将其提供给traceback.print_exception()

runner = CliRunner()
result = runner.invoke(my_command)
traceback.print_exception(*result.exc_info)

答案 5 :(得分:-2)

如果您要调试单击命令功能后执行的模块/类。

经济实惠的解决方案是创建一个脚本,模拟执行命令后执行的流程。

然后,通过在所需的行中放置调试点,您可以实现调试功能。

这是我在简短的网络搜索后想要做的事情。