我在python中使用click library构建了一个cli应用程序。没有关于如何调试命令的文档。
没有单击,它很容易在IDE中调试python文件,但是当我们使用click时,需要通过setup.py中的console_scripts安装程序运行这些命令。
答案 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()))
您也可以使用print
或click.echo
执行此操作。
答案 2 :(得分:1)
setup.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)
如果您要调试单击命令功能后执行的模块/类。
经济实惠的解决方案是创建一个脚本,模拟执行命令后执行的流程。
然后,通过在所需的行中放置调试点,您可以实现调试功能。
这是我在简短的网络搜索后想要做的事情。