繁体   English   中英

在调试器中更改 Python 代码

[英]changing Python code in the debugger

是否有任何调试器允许在调试时更改 Python 代码?

换句话说:运行时异常发生,调试器停止,我以任何我喜欢的方式更改代码,并告诉程序继续。

我知道这种方法的问题,如果我动态重新定义函数,对函数的引用仍然指向旧定义,依此类推。 我对此没有意见,因为我只想能够在非常简单的情况下进行小的修复。

另一方面,我也对理论上是否可以允许更改 Python 代码而不会遇到这些问题感兴趣:即,以某种方式更新对已更改对象的所有引用等。我几乎可以肯定答案是第二个问题是否定的,但如果我错了,我想知道。

编辑:如果我的目标(在发生异常时以交互方式更改代码,然后继续执行)可以在没有调试器的情况下实现 - 那也很好。 我不需要使用调试器。

由于您可以随时以您想要的方式更改常规类的内容,因此无需更新对对象的引用:您只需使用新方法和其他属性更新类的__dict__

问题在于对函数的引用:您无法在不更改函数标识的情况下更新函数。 您可以使用始终按名称查找实际函数的代理函数,并且您可以随时更改实际函数。 否则,您计划您的代码,使其不会长时间存储函数引用; 一旦一个函数被更新,它很快就会被名称查找,但是在某处传递的旧引用将继续执行一段时间。

当您希望在不严重停机的情况下升级系统时,这种修补对于长期运行的系统是有意义的:您暂停它一会儿以一致地升级多个类和函数并取消暂停。 AFAIK Erlang 以类似的方式进行即时更新。

是的,pdb 可以做到这一点。 尽管您必须在另一个编辑器中进行编辑,并且更改将被忽略,直到您重新启动。

但是由于您要做的只是小的更改,因此这不是问题。 但是你不能改变正在运行的代码(除了重新加载,见下文),因为改变代码意味着代码和状态不同步。

您可以使用调试器做的是测试您想要做的更改。 您可以根据需要粘贴代码以进行更改,从而无需重新运行整个程序即可测试它是否正确。 但在这种情况下,您不要编辑文件。

(在某些特定情况下,您可能可以通过谨慎使用“reload()”来避免重新启动,但这可能不值得付出努力。)

您可以使用 xreload 更新正在运行的 Python 进程中的代码:

http://svn.python.org/projects/sandbox/trunk/xreload/xreload.py

有很多限制,它们列在文件的顶部。 我不确定这是否能处理你想要的情况 - 你真的想阻止异常传播吗? 这需要的不仅仅是更新正在运行的程序。

理论上是否可以允许更改 Python 代码

是的。 可以“即时”更新代码对象。 Python VM 中的任何内容似乎都无法阻止这一点。 没有对校验和或任何东西的持续验证。

以某种方式更新对已更改对象的所有引用,

这甚至没有意义。 一旦更改了类级方法定义,“更新”所有引用甚至没有必要或明智。 代码在唯一的地方发生了变化。

这就是调试器不好的原因。 它们似乎会导致模糊不清的想法。 对调试器考虑太多意味着对手头的真正问题考虑太少。

TDD 是一项远好得多的投资。 小型、易于管理的单元测试运行速度很快,并提供持久的证据证明事情有效。

http://en.wikipedia.org/wiki/Test-driven_development

name = (input("请输入姓名:"))

if name == "e": print("这个词有一个字母e")

else : print("这个词没有字母e")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM