【问题标题】:How to recompile python code on the fly during pydev debug in eclipse如何在 Eclipse 中的 pydev 调试期间即时重新编译 python 代码
【发布时间】:2014-08-01 02:25:11
【问题描述】:

我假设这个问题对 pydev 来说是通用的,但我只在 eclipse 中使用过 pydev 所以我不确定......

过去,我不小心这样做了,我想学习如何定期这样做:

  1. 我在 eclipse pydev 中运行断点调试器
  2. 我停在一行代码上,意识到我需要改变一些东西
  3. 我对代码进行了更改
  4. 我保存了代码
  5. 调试器在我上次更改之前跳转,以便我可以继续调试会话并使用新更改:
    • 就好像旧代码从未发生过一样

我不确定这是如何工作的,但我想确切了解如何触发它,因为在我调试时它不再发生。

【问题讨论】:

  • 顺便说一句,python 代码不是编译而是解释。
  • @JakobBowyer 废话,CPython 有.pyc 文件,标准库中有compile()。它有时会输出字节码,然后被解释(但并非总是如此!参见 Nuitka、PyPy 的 JIT、Cython 和其他小众实现),但这是一个实现细节。
  • @delnan 但你(在很大程度上)可以执行任何 python 代码,而无需将其“编译”为字节码,使其成为一种纯粹的解释语言
  • 没有语言被编译或解释。 CPython 的解释器组件是一个字节码解释器,它也接受源代码并将其透明地编译为字节码。但这并不意味着编译的概念是没有意义的(正如你所暗示的那样)——例如,在内存中动态生成 Python 代码时,注意compile() 步骤非常重要。它还会影响可用的自省功能(函数只有__code__ 属性,它们不携带源代码)。但是,是的,OP 实际上关心的是动态替换代码。

标签: python debugging pydev on-the-fly


【解决方案1】:

嗯,这有一些方面:

如果您使用的是框架(例如 Django),它具有内置的重新加载支持,因此,您可以即时更改代码(通常通过生成新进程)。

现在,如果不是这种情况,在最新的 PyDev 版本中,PyDev 将跟踪对代码所做的版本,并尝试将旧代码“热交换”为新代码。

它基于 xreload 并会尝试在运行时修补类(即:直接更改类/方法代码)。

唯一需要注意的是,它只有在你离开给定函数并稍后再次返回它时才会生效,因为 Python 无法修补正在运行的帧上的代码(有时它可能不会成功是否根据代码的构造方式进行交换,但对于常见情况,它确实运行良好)。

请注意,这仅在最新的 PyDev 版本中可用。它在一些早期版本中,但由于其实施中的问题而被删除 - 但经过改造并重新添加回来:)

有关详细信息,请参阅:http://pydev.org/manual_adv_debugger_auto_reload.html

【讨论】:

    猜你喜欢
    • 2022-10-06
    • 2010-12-26
    • 2021-07-31
    • 2011-02-11
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    相关资源
    最近更新 更多