【问题标题】:Python `breakpoint()` attributeError - 'StringStream' object has no attribute 'readline'Python `breakpoint()` attributeError - \'StringStream\' 对象没有属性 \'readline\'
【发布时间】:2023-02-26 18:33:06
【问题描述】:
我有一个复杂的环境,我想在一开始就停止执行子进程。在 js 中你有 debugger; 而 Python 的替代是 breakpoint() 或 pdb.set_trace()。
我尝试将 breakpoint() 放在子代码的开头,结果出现以下错误:
...
File "/usr/lib/python3.9/cmd.py", line 126, in cmdloop
line = input(self.prompt)
AttributeError: 'StringStream' object has no attribute 'readline'
发生这种情况是因为(我相信)没有标准输入可以连接。我怎样才能解决这个问题?我只想在开始处停止执行然后附加 VSCode。
【问题讨论】:
标签:
python
visual-studio-code
【解决方案1】:
Python 中的 breakpoint() 函数激活内置的 pdb 调试器。您遇到的错误消息表明 pdb 调试器正在尝试从 stdin 读取,这在您当前的上下文中不可用。
解决此问题的一种方法是启动带有调试器的子进程。您可以通过使用 -m pdb 标志运行子进程来执行此操作,该标志告诉 Python 自动启动 pdb 调试器:
python -m pdb child_process.py
这将启动子进程并立即在第一行代码处暂停执行。然后,您可以通过在 VSCode 调试器中选择“附加到进程”选项并指定子进程的进程 ID,将调试器附加到 VSCode 中的子进程。
或者,您可以尝试使用 ptpython 库,它提供了一个增强的交互式 shell,支持调试。您可以使用 pip 安装 ptpython:
pip install ptpython
然后,您可以不使用 breakpoint(),而是使用 ptpython.repl 模块中的 embed() 函数在子进程的开头启动交互式 shell:
from ptpython.repl import embed
embed(globals(), locals())
这将在您的子进程开始时启动一个交互式 shell,您可以在其中检查和修改变量,并单步执行代码。要退出交互式 shell 并继续执行子进程,只需键入 exit 或按 Ctrl-D。