【问题标题】: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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-08
      • 2021-08-20
      • 2020-09-11
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      相关资源
      最近更新 更多