PDB 中的自动完成和 Tab 键
Posted
技术标签:
【中文标题】PDB 中的自动完成和 Tab 键【英文标题】:Autocomplete and tab key in PDB 【发布时间】:2013-04-04 23:18:53 【问题描述】:我一直试图让 TAB 在 (pdb) 提示符下插入选项卡之外的其他操作。
我想到的是触发自动完成,例如在 here 或 here 中,但 tab 键除了向 pdb 添加选项卡之外没有其他任何作用。
所以:
(pdb)var + tabKeyPressed我想得到:
(pdb) 变量代替:
(pdb)var[]【问题讨论】:
这似乎与我的 Python 安装有关,在另一台计算机上,两个封闭的链接都像一个魅力。 【参考方案1】:ipdb 来救援。
ipdb 导出函数以访问 IPython 调试器,该调试器具有 制表符补全,语法高亮,更好的回溯,更好 与 pdb 模块具有相同接口的内省。
【讨论】:
我确实试了一段时间,确实发货了。我只是不太喜欢它。 @RodrigoLopez:你改用/做什么? PDB 自动完成功能最终正常工作(我的安装中出现了问题)。 PDB 完成了这项工作(今天我可能会使用 VSC,tbh) 大约一半的时间 ipdb 不适用于我的用例(它崩溃并出现不返回任何谷歌结果的无意义错误,而且我没有时间调试我的调试器正在尝试调试代码) @vlsd,我已经使用 ipdb 多年,没有崩溃过。【参考方案2】:iPython 是这个问题的第三方解决方案。有时你只能依赖普通的 Python。我找到了 2 个解决方案。
Per-shell 解决方案 - 使用模块“rlcompleter”:
$ python3
Python 3.4.3 (default, Sep 14 2016, 12:36:27)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pdb
>>> pdb.set_trace()
--Return--
> <stdin>(1)<module>()->None
# press tab - but nothing
(Pdb) str.
*** SyntaxError: invalid syntax
(Pdb) --KeyboardInterrupt--
(Pdb) c
>>> import rlcompleter
>>> pdb.Pdb.complete=rlcompleter.Completer(locals()).complete
>>> pdb.set_trace()
--Return--
> <stdin>(1)<module>()->None
(Pdb) str.
str.__add__( str.__getattribute__( str.__name__ str.__text_signature__ str.isdigit( str.rfind(
str.__base__( str.__getitem__( str.__ne__( str.__weakrefoffset__ str.isidentifier( str.rindex(
str.__bases__ str.__getnewargs__( str.__new__( str.capitalize( str.islower( str.rjust(
str.__basicsize__ str.__gt__( str.__prepare__( str.casefold( str.isnumeric( str.rpartition(
str.__call__( str.__hash__( str.__qualname__ str.center( str.isprintable( str.rsplit(
str.__class__( str.__init__( str.__reduce__( str.count( str.isspace( str.rstrip(
str.__contains__( str.__instancecheck__( str.__reduce_ex__( str.encode( str.istitle( str.split(
str.__delattr__( str.__itemsize__ str.__repr__( str.endswith( str.isupper( str.splitlines(
str.__dict__ str.__iter__( str.__rmod__( str.expandtabs( str.join( str.startswith(
str.__dictoffset__ str.__le__( str.__rmul__( str.find( str.ljust( str.strip(
str.__dir__( str.__len__( str.__setattr__( str.format( str.lower( str.swapcase(
str.__doc__ str.__lt__( str.__sizeof__( str.format_map( str.lstrip( str.title(
str.__eq__( str.__mod__( str.__str__( str.index( str.maketrans( str.translate(
str.__flags__ str.__module__ str.__subclasscheck__( str.isalnum( str.mro( str.upper(
str.__format__( str.__mro__ str.__subclasses__( str.isalpha( str.partition( str.zfill(
str.__ge__( str.__mul__( str.__subclasshook__( str.isdecimal( str.replace(
(Pdb) c
>>>
系统范围的解决方案 - 使用文件 ~/.pdbrc
$ cat ~/.pdbrc
import rlcompleter
pdb.Pdb.complete=rlcompleter.Completer(locals()).complete
$ python3
Python 3.4.3 (default, Sep 14 2016, 12:36:27)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pdb
>>> pdb.set_trace()
--Return--
> <stdin>(1)<module>()->None
(Pdb) str.
str.__add__( str.__getattribute__( str.__name__ str.__text_signature__ str.isdigit( str.rfind(
str.__base__( str.__getitem__( str.__ne__( str.__weakrefoffset__ str.isidentifier( str.rindex(
str.__bases__ str.__getnewargs__( str.__new__( str.capitalize( str.islower( str.rjust(
str.__basicsize__ str.__gt__( str.__prepare__( str.casefold( str.isnumeric( str.rpartition(
str.__call__( str.__hash__( str.__qualname__ str.center( str.isprintable( str.rsplit(
str.__class__( str.__init__( str.__reduce__( str.count( str.isspace( str.rstrip(
str.__contains__( str.__instancecheck__( str.__reduce_ex__( str.encode( str.istitle( str.split(
str.__delattr__( str.__itemsize__ str.__repr__( str.endswith( str.isupper( str.splitlines(
str.__dict__ str.__iter__( str.__rmod__( str.expandtabs( str.join( str.startswith(
str.__dictoffset__ str.__le__( str.__rmul__( str.find( str.ljust( str.strip(
str.__dir__( str.__len__( str.__setattr__( str.format( str.lower( str.swapcase(
str.__doc__ str.__lt__( str.__sizeof__( str.format_map( str.lstrip( str.title(
str.__eq__( str.__mod__( str.__str__( str.index( str.maketrans( str.translate(
str.__flags__ str.__module__ str.__subclasscheck__( str.isalnum( str.mro( str.upper(
str.__format__( str.__mro__ str.__subclasses__( str.isalpha( str.partition( str.zfill(
str.__ge__( str.__mul__( str.__subclasshook__( str.isdecimal( str.replace(
(Pdb) c
>>>
注意事项:
仅在 Python 3.4 上测试
操作系统 - Linux Mint
基于https://reminiscential.wordpress.com/2009/06/12/python-enable-auto-complete-in-a-pdb-session/
【讨论】:
要使用带有python -m pdb script.py
的invoke pdb,您还应该在.pdbrc
中使用import pdb
。
我正在使用 .pdbrc。我的 python3.7 安装缺少 gnureadline。因此,如果这种方法不起作用,请尝试pip install gnureadline
jupyter 笔记本呢?考虑到tabKeyPressed
实际上将焦点移动到下一个单元格,这是否有意义? (例如,如果我使用 %%debug)——谢谢!【参考方案3】:
官方文件说:
在 3.3 版中更改:通过 readline 模块的制表符补全可用于命令和命令参数,例如当前的全局和局部名称作为 p 命令的参数提供。
https://docs.python.org/3/library/pdb.html
所以你只需使用p
命令:
(Pdb) p var[TAB] # complete global and local names
var1 var2
(Pdb) [TAB] # complete commands
EOF b cl cont disable exit interact list next quit retval source unalias up
a break clear continue display h j ll p r run step undisplay w
alias bt commands d down help jump longlist pp restart rv tbreak unt whatis
args c condition debug enable ignore l n q return s u until where
【讨论】:
这很好!可以验证在 python 3.7.1 中工作以上是关于PDB 中的自动完成和 Tab 键的主要内容,如果未能解决你的问题,请参考以下文章
如何移出 IntelliJ IDEA 中的自动完成括号(不使用箭头键)?