Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用带制表符完成的python调试器运行pytest? 背景_Python_Debugging_Pytest_Pdb_Ipdb - Fatal编程技术网

如何使用带制表符完成的python调试器运行pytest? 背景

如何使用带制表符完成的python调试器运行pytest? 背景,python,debugging,pytest,pdb,ipdb,Python,Debugging,Pytest,Pdb,Ipdb,我已经用ipythonimport-embed的纯调试了我的python脚本约2年;embed(),它一直工作得很好。我只需将命令放在我想要检查的行上,当运行脚本时,我将拥有完整的IPython shell,具有检查变量、定义函数等功能。除此之外,IPython shell还提供了变量名选项卡完成功能 -> x = 1 + some_variable (Pdb) so[<tab_here_produces_tab>] -> x = 1 + some_variable (

我已经用ipythonimport-embed的纯
调试了我的python脚本约2年;embed()
,它一直工作得很好。我只需将命令放在我想要检查的行上,当运行脚本时,我将拥有完整的IPython shell,具有检查变量、定义函数等功能。除此之外,IPython shell还提供了变量名选项卡完成功能

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

ipdb> so[<tab_here_produces_tab>]
现在,不再总是使用ipythonimport-embed中的
定义“暂停线”;embed()
,我希望我的python脚本在运行测试时遇到异常时暂停执行

问题: 如何以这样的方式运行
pytest

  • 当引发异常时,它将启动python调试器
  • 此调试器有变量名的制表符完成
  • 安装程序
    • 视窗10
    • Python 3.6
    简单失败测试 (不,您不需要像这样为pytest编写测试,但是出于这个示例性目的,这很好。)

    不起作用的解决方案 1. <代码>pytest--pdb(未安装
    pdbpp
    ) 这将在运行到错误时打开基本shell。但它没有标签完成

    -> x = 1 + some_variable
    (Pdb) so[<tab_here_produces_tab>]
    
    -> x = 1 + some_variable
    (Pdb++) so[<tab_here_produces_tab>]
    
        103
        104 def test_me(some_variable):
    --> 105     x = 1 + some_variable
        106     return x
        107
    
    ipdb> so[<tab_here_produces_tab>]
    
    3.
    pytest--pdb--pdbcls=IPython.terminal.debugger:pdb
    这将在运行到错误时打开基本shell。但没有标签完成

    -> x = 1 + some_variable
    (Pdb) so[<tab_here_produces_tab>]
    
    -> x = 1 + some_variable
    (Pdb++) so[<tab_here_produces_tab>]
    
        103
        104 def test_me(some_variable):
    --> 105     x = 1 + some_variable
        106     return x
        107
    
    ipdb> so[<tab_here_produces_tab>]
    
    103
    104 def测试(某些变量):
    -->105 x=1+某些变量
    106返回x
    107
    ipdb>so[]
    
    4. <代码>fancycompleter.interact() 按建议尝试了
    fancycompleter.interact()
    ,运气不佳(使用
    pdb
    ipdb
    pdbpp
    fancycompleter v.0.8
    甚至)

    5. <代码>pytest--pdb-s 如前所述,有
    -s
    标志可用于
    pytest
    。但是,制表符补全仅部分起作用:如果同一起始字符有多个选项,它将打印出可能的变量列表。这缺乏快速选择一个匹配变量的能力(例如,在IPython shell中提供):

    有没有办法让变量名选项卡完成工作?我更喜欢
    ipdb
    pdbpp
    而不是普通的
    pdb
    ,但即使是使用
    pdb
    的工作解决方案也可以

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

    1.别名
    emb
    用于启动
    IPython.embed()
    1.1. 台阶
    • 生成
      ~/.pdbrc
      文件(
      ‪C:\Users\\.pdbrc
      ),包含以下内容
    1.2. 简短解释
    • 当使用
      --pdb
      标志运行
      pytest
      时,它启动标准库pdb,或者如果安装了pdbpp
    • 标准图书馆 文件说:
    如果用户的主目录或当前目录中存在文件.pdbrc,则该文件将读入并执行,就像在调试器提示下键入一样。这对于别名特别有用。如果两个文件都存在,则首先读取主目录中的文件,并且本地文件可以覆盖其中定义的别名

    2.别名的提醒文本(可选) 2.1. 台阶
    • 已安装的
      pdbpp
      pip安装pdbpp
    • 制作了
      ~/.pdbrc.py
      1个文件(
      ‪C:\Users\\\.pdbrc.py
      ),包含以下内容
    2.2. 简短解释 说明如果使用
    setup()
    方法创建
    ~/.pdbrc.py
    ,则在进入调试器时将调用它。因此,可以创建一个脚本,在每次输入调试shell时调用该脚本

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

    3.用法示例 运行
    pytest--pdb
    (与问题中的.py文件相同)。如图所示,变量
    some_variable
    的制表符完成工作正常


    在上找到一些相关讨论,看起来您忘记了
    -s
    选项谢谢!没有注意到那面旗帜。这是一个很好的解决方案,因为它没有添加额外的步骤,但它的缺点是,如果有多个变量名以相同的字母开头,它实际上不允许制表符完成。它只打印可用的选项。我将添加一个示例图片。您最近是否使用最新版本的pytest尝试了
    pdbpp
    。选项卡完成在我的机器上使用pytest上的pdbpp可以正常工作。是的,我现在使用
    pdbpp 0.10.2
    pytest 5.4.3
    进行了尝试,但是没有选项卡完成。可能缺少其他软件包,或者是Windows/Powershell的问题。