如何使用带有选项卡完成功能的python调试器运行pytest?

时间:2018-10-03 12:13:07

标签: python debugging pytest pdb ipdb

背景

我使用普通的text1 <- "what" setNames(c("blue", "red"), paste0(text1, c('_suffix', '_suffix2'))) what_suffix what_suffix2 "blue" "red" 调试python脚本已有2年了,并且运行良好。我只是将命令放在要检查的行上,并且在运行脚本时,我将拥有完整的IPython Shell,具有检查变量,定义函数等的能力。最重要的是,IPython Shell带有变量名制表符。 / p>

现在,我不希望总是使用from IPython import embed; embed()来定义“暂停行”,而是希望我的python脚本在运行测试时遇到异常时暂停执行。

问题

您如何以这种方式运行from IPython import embed; embed()

  1. 引发 except 时,它会启动python调试器
  2. 该调试器是否具有变量名的制表符

设置

  • Windows 10
  • Python 3.6

简单的测试失败

pytest

(不,您不会像这样为pytest编写测试,但出于示例目的,这很好。)

无效的解决方案

1。 # test_somemodule.py def test_me(some_variable): x = 1 + some_variable return x test_me('I am a string') (未安装pytest --pdb

运行错误时,这将打开基本的pdb shell。但是它没有制表符补全。

pdbpp

2。 -> x = 1 + some_variable (Pdb) so[<tab_here_produces_tab>] (已安装 pytest --pdb

运行错误时,这将打开基本的pdbpp shell。但是没有制表符补全。

pdbpp

3。 -> x = 1 + some_variable (Pdb++) so[<tab_here_produces_tab>]

运行错误时,这将打开基本的ipdb shell。但是没有制表符补全。

pytest --pdb --pdbcls=IPython.terminal.debugger:Pdb

4。 103 104 def test_me(some_variable): --> 105 x = 1 + some_variable 106 return x 107 ipdb> so[<tab_here_produces_tab>]

按照建议的here尝试了fancycompleter.interact(),没有运气(与fancycompleter.interact()pdbipdbpdbpp甚至{{3} }。)。

5。 fancycompleter v.0.8

正如this patched version所说,pytest --pdb -s-s标志可用。但是,制表符补全仅部分起作用:如果同一起始字符有多个选项,它将打印出可能变量的列表。这缺乏快速选择匹配变量之一的能力(例如,在IPython shell中可用):

Sergey Voronezhskiy

有没有办法使变量名制表符完成工作?我更喜欢pytestipdb而不是香草pdbpp,但即使使用pdb的有效解决方案也很好。

1 个答案:

答案 0 :(得分:1)

这不是最佳解决方案,但是总比没有好。也许有人会给出更好的答案。这是我所做的

  1. 已安装pdbpppip install pdbpp
  2. 制作了具有以下内容的~/.pdbrc文件(‪C:\Users\<USER>\.pdbrc

    alias emb from IPython import embed; embed()

  3. 制作的~/.pdbrc.py文件(‪C:\Users\<USER>\.pdbrc.py)具有以下内容

import pdb


class Config(pdb.DefaultConfig):
    def setup(self, pdb):
        print('Use "emb" to enter IPython shell')

用法示例

运行pytest --pdb(与问题相同的.py文件)。从图中可以看出,变量some_variable的制表符完成。

tab completion inside IPython shell inside pdbpp