【问题标题】:How to debug external .py functions run from Jupyter/IPython notebook如何调试从 Jupyter/IPython 笔记本运行的外部 .py 函数
【发布时间】:2017-01-20 19:15:43
【问题描述】:

我的 Jupyter/IPython 笔记本在外部 .py 中执行函数。

我需要在这些函数中设置断点、检查变量、单步等。

结合使用print 语句和抛出异常来提前退出单元格是不切实际的。

我需要某种工作流程。

是否可以连接一些第三方编辑器/IDE 来查看 .py 并以某种方式将其连接到 Jupyter/IPython 正在使用的 Python 运行时?

因此,如果我使用 IDE 在外部 .py 中设置断点并在笔记本中执行遇到所述断点的单元格,我可以继续在 IDE 中手动导航。

编辑:我找到了https://pypi.python.org/pypi/ipdbhttps://www.quora.com/What-are-your-favorite-tricks-for-IPython-Notebook

编辑https://www.youtube.com/watch?v=Jb2HHOahvcE

编辑:看起来 PyCharm 完全符合我的要求:https://www.jetbrains.com/help/pycharm/2016.1/tutorial-using-ipython-jupyter-notebook-with-pycharm.html

编辑:我正在尝试让 PyC​​harm 正常运行。如果我整理出来,我会在答案中提供详细信息。

【问题讨论】:

标签: python debugging ipython jupyter-notebook spyder


【解决方案1】:

是否可以连接一些第三方编辑器/IDE 来查看 .py 并以某种方式将其连接到 Jupyter/IPython 正在使用的 Python 运行时?

是的,有可能

使用Emacs 作为您的第三方 Python IDE。

您可以使用 iPython 运行时并排打开文件。可以使用快捷键将外部文件中的定义直接发送到提示符,并使用标准 python 调试器 pdb 从 iPython 提示符设置断点、单步和检查变量

自动完成工作正常。只需编写 import XXX 即可让 Emacs 了解 XXX 模块中的所有功能。

这是一个示例屏幕截图:

这些是我获取屏幕截图的步骤。*

  1. 在 Emacs 上打开文件 playground.py。
  2. C-c C-p启动 iPython 进程并将文件连接到它。请注意,iPython 进程功能齐全。我可以在上面调用所有的魔法方法。
  3. M-m m d b 在我想要的行中包含断点(以 pdb 导入的形式)
  4. C-M-x将定义发送到 iPython 提示符。请注意,我在屏幕截图中调用unique_everseen,而从未在提示中输入它。定义是直接从文件发送的(这就是为什么我们有一个空单元格2,作为 Emacs 做了某事的视觉反馈)。
  5. 从 iPython 提示符执行函数以触发断点。我得到信息告诉我我在哪一行并自动进入调试器。
  6. 检查变量看看发生了什么。
  7. 我按n进入下一个指令。
  8. 我单击文件名(在提示中显示为红色),它会将我的光标直接带到 playground.py 文件中的该行。注意行号旁边的黑色三角形,告诉我步进器在哪里。非常好。

现在,我什至还没有触及到 Emacs 所能提供的功能的表面。 如果您对此感兴趣,我建议您研究一下。它真的很强大,并且有一个很棒、很有帮助和活跃的社区。​​p>

要让所有 Python 配置开箱即用,而无需自己进行任何配置,只需安装 Spacemacs,这是一个流行的 Emacs 发行版(anaconda 之于 Python,Spacemacs 之于 Emacs)。安装说明可以在链接下找到。

使用 Emacs 编辑 iPython 笔记本。

一个名为 EIN(Emacs iPython Notebooks)的包“提供了一个 IPython Notebook 客户端并在 Emacs 中集成了 REPL。” 要使其正常工作,您可以使用ipython notebook 从任何终端打开您的 iPython 笔记本服务器,然后调用函数ein:notebooklist

更多信息可以在项目页面here和Spacemacs iPython-Notebook层页面here上找到。

特别是来自 EIN 文档:

  1. 复制/粘贴单元格,甚至复制/粘贴到不同的笔记本。
  2. 控制台集成:您可以通过控制台应用程序轻松连接到内核。这使您能够在同一个内核中开始调试。甚至可以通过 ssh 连接到控制台。
  3. IPython 内核可以“连接”到任何 Emacs 缓冲区。这使您能够使用与笔记本相同的内核来评估缓冲区或缓冲区。这些缓冲区中提供了工具提示帮助、帮助浏览器和代码完成等笔记本好东西。
  4. 跳转到定义(在对象上按 M-. 转到定义)。

上述简单 iPython + 文件工作流的所有功能都可用于 iPython 笔记本 (*.ipynb)。

截图here.

【讨论】:

  • 感谢您提供的信息丰富的答案。不幸的是,我需要 IPython notebooks 的解决方案,而不仅仅是 IPython。
  • @Pi 您的问题要求提供将 .py 文件链接到 ipython 内核的解决方案。这就是我提供的。无论如何,我已经将解决​​方案扩展到包含 notebooks
【解决方案2】:

在 Jupyter 中,您可以通过在以下两行添加断点来使用 python 调试器。

import pdb
pdb.set_trace()

代码执行将在此步骤暂停,并为您提供用于调试 Python 代码的文本框。我已经附上了相同的屏幕截图。

您可以参考 pdb documentation 了解除了打印变量之外您可以执行的操作

【讨论】:

  • 这不是一个很好的答案,因为如果您想调试笔记本从另一个文件调用的代码,您必须访问并编辑该代码。最好有 b library.py:22 的等效项,可以在 Jupyter 中使用而无需编辑 library.py
【解决方案3】:

我们刚刚发布了用于 Jupyter Notebooks 的 Python 可视化调试器的第一个版本,这可能会引起人们的兴趣。您可以找到详细信息here
(免责声明:我是首席开发人员)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    相关资源
    最近更新 更多