如何在Jupyter/IPython笔记本中运行外部.py函数并进行调试

12

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

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

使用 print 语句和抛出异常结合以提前退出单元格并不实用。

我需要某种工作流程。

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

因此,如果我在我的 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<--这个视频已经接近我想要的内容了,但我无法完全看到如何将所有内容放在一起。那个视频展示了一个带有 IPython 提示符的 IDE,称为 Spyder...我想知道是否可以通过提示符运行我的笔记本电脑并进行调试。

编辑:看起来 PyCharm 恰好做到了我想要的:https://www.jetbrains.com/help/pycharm/2016.1/tutorial-using-ipython-jupyter-notebook-with-pycharm.html

编辑:我正在尝试让 PyCharm 正常工作。如果我解决了它,我将在答案中提供详细信息。


我使用PTVS获得了这种调试体验,但是注意到一个小烦恼:https://github.com/Microsoft/PTVS/issues/1083 - denfromufa
3个回答

6

是否可以连接第三方编辑器/IDE以查看 .py 文件,并将其与 Python 运行时 Jupyter/IPython 相连接?

是的,可以

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

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

自动完成功能正常。只需编写 import XXX 即可使 Emacs 知道 XXX 模块中的所有函数。

以下是一个示例截图: Spacemacs

这些是我遵循的步骤,以达到截图效果*。

  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可以提供什么的表面。 如果您对此感兴趣,我建议您深入了解一下。它非常强大,并且拥有一个非常有帮助和活跃的社区。
要使所有Python配置无需自己进行任何配置即可运行,请安装Spacemacs,这是Emacs的流行分发(就像anaconda是Python,Spacemacs是Emacs一样)。 安装说明可以在链接下找到。
使用Emacs编辑iPython笔记本。
一个名为EIN(Emacs iPython Notebooks)的软件包“提供了一个IPython Notebook客户端和集成的REPL函数”。 要使其工作,您需要从任何终端打开iPython笔记本服务器,然后调用函数ein:notebooklist

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

特别是,从EIN文档中:

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

上述所有针对简单iPython+文件工作流程的功能均适用于iPython笔记本(*.ipynb)。

屏幕截图 这里。


感谢您提供这个信息丰富的答案。不幸的是,我需要一个针对IPython _notebooks_的解决方案,而不仅仅是IPython。 - P i
@Pi,你的问题是要解决将一个.py文件链接到一个ipython内核的方案。这就是我提供的方案。无论如何,我已经扩展了解决方案,以涵盖_notebooks_。 - Daniel

6
在 Jupyter 中,您可以通过添加以下两行代码来设置断点并使用 Python 调试器。
import pdb
pdb.set_trace()

在这一步中,代码执行将会暂停,同时提供给您一个文本框以便调试Python代码。我已经附上了截图。

除了打印变量之外,您可以参考pdb 文档 来执行其他操作。

Jupyter Notebook中的PDB


2
这不是一个很好的答案,因为如果您想要调试笔记本调用的另一个文件中的代码,则必须深入其中并编辑该代码。最好有类似于b library.py:22的等效物,可以在Jupyter中使用而无需编辑library.py - Robert P. Goldman

5
我们刚刚发布了一款针对Jupyter Notebooks的Python可视化调试器的第一个版本,这可能会引起您的兴趣。您可以在这里找到详细信息。
(声明:我是主要开发人员)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接