3

当我尝试使用 ipdb 调试此示例脚本时:

n = 1
next = 1
print('end')

我无法执行第 3 行,因为 python 变量掩盖了 pdb 命令:

$ ipdb test.py
> /tmp/test.py(1)<module>()
----> 1 n = 1
      2 next = 1
      3 print('end')

ipdb> next
> /tmp/test.py(2)<module>()
      1 n = 1
----> 2 next = 1
      3 print('end')

ipdb> next
> /tmp/test.py(3)<module>()
      1 n = 1
      2 next = 1
----> 3 print('end')

ipdb> next
1
ipdb> n
1
ipdb> !n
1
ipdb> !next
1

当不再识别两个命令(n/next)时,如何进一步执行代码?(假设 s/step 也被变量所掩盖)。

到目前为止我尝试了什么:

  • 使用 ipdb3 而不是 ipdb - 同样的问题(可能是因为在我的情况下 ipdb 链接到 ipdb3 :))
  • 使用 pdb - 它有效!n/next 命令移至下一行,而不是显示 python 变量。我的ipdb怎么了?
  • !!n缓解了这个问题 - 它运行 ipdb 版本的next. 如果我可以alias n !!n然后重复使用Enter它来执行它,那么问题就会为我解决。但Enter只显示变量n而不是运行别名n(应该解析为!!n

我在用着

  • Manjaro Linux 16.10
  • Python 3.5.2 :: Anaconda 4.2.0(64 位)
  • ipdb (0.10.1)
  • ipython (5.1.0)
  • ipython-genutils (0.1.0)
  • 我没有 ~/.pdbrc 文件

编辑

该问题由以下人员修复:https ://github.com/ipython/ipython/pull/10050

4

1 回答 1

2

2016 年 12 月 14 日更新:

最后 iPython 团队决定撤销这个设计


您的问题的解决方案是使用!!语句强制标准行为。

> /home/v-zit/test.py(1)<module>()
----> 1 n = 1
      2 next = 11
      3 print('end')

ipdb> n
> /home/v-zit/test.py(2)<module>()
      1 n = 1
----> 2 next = 11
      3 print('end')

ipdb> n
1
ipdb> !!n
> /home/v-zit/test.py(3)<module>()
      1 n = 1
      2 next = 11
----> 3 print('end')

ipdb> next
11
ipdb> !!next
end
--Return--
None
> /home/v-zit/test.py(3)<module>()
      1 n = 1
      2 next = 11
----> 3 print('end')

ipdb>

参考:

https://github.com/ipython/ipython/pull/9449

https://github.com/ipython/ipython/pull/10050

于 2016-10-24T19:15:42.213 回答