在Python调试器中有没有搜索代码的方法?

2024-04-27 03:28:20 发布

您现在位置:Python中文网/ 问答频道 /正文

简单的问题,但我找不到答案。你知道吗

在Perl调试器中,可以使用“/string”搜索代码,就像键入/后跟要搜索的字符串一样。你知道吗

下面是一个简单的Perl调试会话的示例,我在这里查找单词“init”来定位子例程initFromCfgFile。我在第93行使用“/”两次后发现:

% perl -d padmin.pl

Loading DB routines from perl5db.pl version 1.28
Editor support available.

Enter h or `h h' for help, or `man perldebug' for more help.

main::(padmin.pl:18):   my $ACTION_STOP    = 'stop';
   DB<1> /init
59:     initFromCfgFile();

   DB<2> /
93:     sub initFromCfgFile {   


有没有一种方法可以对Python调试器执行同样的操作?你知道吗


Tags: or字符串答案代码fordbstring键入
3条回答

通读pdb docs,看起来不像。您可以使用l来显示代码,它需要一个行号参数,这样您就可以四处浏览,您也可以尝试source <expr>来查找与特定对象关联的源代码,但是对于全文搜索,我认为您最好的选择是在编辑器中单独打开文件,或者使用grep。你知道吗

您可以使用do_find方法来实现find命令(使用do_f属性来实现f命令别名),将pdb.Pdb作为cmd.Cmd的子类:

import pdb
import linecache

class fdb(pdb.Pdb):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.find = None

    def do_find(self, arg):
        if arg:
            self.find = arg
            self.last_lineno = 0
        elif not self.find:
            self.error('A search string must be specified.')
            return
        filename = self.curframe.f_code.co_filename
        for lineno, line in enumerate(linecache.getlines(filename, self.curframe.f_globals), 1):
            if lineno > self.last_lineno and self.find in line:
                self._print_lines([line], lineno)
                self.last_lineno = lineno
                break
        else:
            self.error(f'No {"more " if self.last_lineno else ""}matching line found.')
    do_f = do_find

fdb().set_trace()

输入和输出示例:

 Return 
> test.py(26)<module>()->None
-> fdb().set_trace()
(Pdb) find
*** A search string must be specified.
(Pdb) find foobar
*** No matching line found.
(Pdb) find error
 14                 self.error('A search string must be specified.')
(Pdb) f
 23                 self.error(f'No {"more " if self.last_lineno else ""}matching line found.')
(Pdb) f
*** No more matching line found.
(Pdb) 

演示:https://repl.it/@blhsing/PureHarmfulApplicationframework

我使用功能齐全的IDE进行Python开发,而不是直接使用命令行工具。在IntelliJ IDEA/PyCharm中,您可以在调试会话期间轻松地导航代码。你知道吗

相关问题 更多 >