Python 调试器(PDB):在编辑器中打开当前活动的 python 文件

问题描述 投票:0回答:1

有没有办法在调试过程中使用

pdb
:

  • 当前打开的Python文件
  • 当前活动的代码行
  • 当前代码行缩进

并在默认文本编辑器中打开文件?

示例。运行下面的代码,然后使用

s
进入
Path
执行并使用一些我正在寻找的命令/代码,我想在第 868 行和第 5 个符号处打开文件
c:\python311\lib\pathlib.py

from pathlib import Path
import pdb; pdb.set_trace()
p = Path()

问题仅在于在

pdb
上下文中获取当前的 python 文件。打开文件本身很简单
os.system(r"C:\test.py")
。需要活动行代码和缩进,以便我能够在 VS Code 中的确切位置打开它:
vsc --goto "C:\test.py:1:5"
(来自
vsc --goto "<filepath>:<linenumber>:<x-coordinates>"
)。

如果是直接从

pdb
执行此操作的某种本机方法,那就太好了,但由于文档中没有任何相关内容,解决方案可能是制作一些自定义方法 - 这也可以。

我已经尝试使用

inspect
模块,但似乎
pdb
正在启动新框架,其中无法访问实际调试的 python 文件:

from inspect import currentframe, getframeinfo
frameinfo = getframeinfo(currentframe())
print(frameinfo.filename, frameinfo.lineno)
# <stdin> 1
python pdb
1个回答
0
投票

我找到了解决办法。研究

pdb
模块,我发现
Pdb
类实例具有
self.curframe
self.botframe
属性,允许访问代码框架及其路径。当我们执行
import pdb; pdb.set_trace()
时,它会自动创建
Pdb
类的实例,我们需要访问。

但是除了 hacky 之外,我还没有找到任何其他方法来获取实例 -

pdb.set_trace()
正在将系统跟踪(使用
sys.settrace
)设置为
Pdb_instance.trace_dispatch
。因此,我们可以使用
Pdb_instance.trace_dispatch
检索
sys.gettrace()
并使用
Pdb
获取
__self__
实例。

最终解决方案是将下面的代码片段添加到您的

pdb.py
文件中(通常位于
Python311\Lib\pdb.py
中)。我想,最好的地方应该是在
def set_trace(*, header=None):
之后。

然后你就可以在 pdb 调试期间调用

import pdb; pdb.vscode()
,它会自动在 VS Code 中打开当前文件。瞧!

PS 需要确保您可以从系统路径访问

vsc.lnk
(链接到 VS Code)。

def vscode():
    """open file currently debugged with pdb in VS code
    (at current line and indent)"""
    import os, linecache, sys, types
    def get_current_pdb_file():
        pdb = sys.gettrace().__self__
        # there is also .botframe - the frame when pdb entered
        frame = pdb.curframe # type: types.FrameType
        return frame.f_code.co_filename, frame.f_lineno
    filepath, line = get_current_pdb_file()
    current_line = linecache.getlines(filepath)[line]
    indent = len(current_line) - len(current_line.lstrip()) + 1

    def vscode_run(filepath, line, indent=1):
        # `line` and `indent` starting from 1
        os.system(f'vsc.lnk --goto "{filepath}:{line}:{indent}"')
    vscode_run(filepath, line, indent)
© www.soinside.com 2019 - 2024. All rights reserved.