繁体   English   中英

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

[英]How to run pytest with an python debugger with tab completion?

背景

我一直在调试我的 Python 脚本大约 2 年,使用普通from IPython import embed; embed() from IPython import embed; embed() ,它一直工作得很好。 我只是将命令放在我想要检查的行上,当运行脚本时,我将拥有完整的 IPython shell,具有检查变量、定义函数等的能力。最重要的是,IPython shell 带有变量名称选项卡完成功能。

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

你如何以这种方式运行pytest ,那

  1. 当引发异常时,它会启动 python 调试器
  2. 这个调试器有变量名的制表符补全吗?

设置

  • 视窗 10
  • 蟒蛇 3.6

简单的失败测试

# test_somemodule.py
def test_me(some_variable):
    x = 1 + some_variable
    return x


test_me('I am a string')

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

不起作用的解决方案

1. pytest --pdb (没有安装pdbpp

这会在运行到错误时打开基本的pdb shell。 但它没有制表符完成。

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

2. pytest --pdb (安装pdbpp

这会在运行到错误时打开基本的pdbpp shell。 但没有选项卡完成。

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

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

这会在运行到错误时打开基本的ipdb shell。 但没有选项卡完成。

    103
    104 def test_me(some_variable):
--> 105     x = 1 + some_variable
    106     return x
    107

ipdb> so[<tab_here_produces_tab>]

fancycompleter.interact()

按照此处的建议尝试了fancycompleter.interact() ,但没有运气(使用pdbipdbpdbppfancycompleter v.0.8甚至这个补丁版本。)。

5. pytest --pdb -s

正如Sergey Voronezhskiy评论的那样, pytest-s标志可用。 但是,制表符完成仅部分起作用:如果相同的起始字符有多个选项,它将打印出可能的变量列表。 这缺乏快速选择匹配变量之一的能力(例如,在 IPython shell 中可用):

带有 -s 标志的示例

有没有办法让变量名选项卡完成工作? 我更喜欢ipdbpdbpp而不是 vanilla pdb ,但即使是pdb的工作解决方案也很好。

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

1. 用于启动IPython.embed()别名emb

1.1. 脚步

  • 使用以下内容制作~/.pdbrc文件( ‪C:\\Users\\<USER>\\.pdbrc
alias emb from IPython import embed; embed()

1.2. 简短说明

  • pytest使用--pdb标志运行时,它会启动标准库 pdb,或者如果安装了 pdbpp。
  • 标准库pdb文档说:

如果文件.pdbrc存在于用户的主目录或当前目录中,则它会被读入并执行,就像在调试器提示符下键入一样。 这对于别名特别有用。 如果两个文件都存在,则首先读取主目录中的文件,并且本地文件可以覆盖在那里定义的别名。

2. 别名提示文字(可选)

2.1. 脚步

  • 安装的pdbpp ( pip install pdbpp )
  • 使用以下内容制作~/.pdbrc.py 1文件( ‪C:\\Users\\<USER>\\.pdbrc.py

import pdb


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

2.2. 简短说明

pdbpp 文档说如果你用setup()方法创建一个~/.pdbrc.py ,它会在你进入调试器时被调用。 因此,可以创建每次进入pdbpp调试 shell 时调用的脚本。

1注意:这个有.py扩展名,而第一个与内置 pdb 相关联,没有。

3. 使用示例

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

pdbpp 中 IPython shell 中的 tab 补全

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM