有没有办法在调试过程中使用
pdb
:
并在默认文本编辑器中打开文件?
示例。运行下面的代码,然后使用
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
我找到了解决办法。研究
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)