跳转到主要内容

在失败的函数中重启调试程序。

项目描述

hot_restart

在失败的函数中重启调试程序。

安装

pip install hot_restart

hot_restart 目前没有除标准库之外的其他依赖项。如果已经导入了 pydevdhot_restart 将使用它来允许在 VS Code(以及其他使用 pydevd / debugpy 的 IDE)中进行调试。

使用

将您期望崩溃的任何函数包裹在 @hot_restart.wrap

import hot_restart

@hot_restart.wrap
def my_func():
    ...

@hot_restart.wrap_class
class MyClass:

    def forward(self, x):
        super().forward(x * 2)

或者,在定义函数和类之后,调用 hot_restart.wrap_module()

当包裹的函数崩溃时,hot_restart 将在包裹的函数中打开一个事后调试器,其余的堆栈仍然在函数调用之上保持活跃。

然后您可以修改崩溃函数的源代码,并从调试器中继续(c)ontinue,hot_restart 将重新加载该函数的源代码(仅该函数)。

hot_restart 使用AST变换来查找新定义,以避免造成“import-time”副作用,并在保持函数的每个版本(除初始加载外)在其自己的源文件中的同时,将行号与真实源代码匹配。

边缘情况

您还可以使用 hot_restart.reload_module() 触发完整的模块重新加载。这可能触发“import-time”副作用和重复(即冲突)的类定义。为了避免在重新加载主模块时重新启动主函数,请检查 hot_restart.is_restarting_module()

hot_restart 使用源重写来处理常见情况,并不修改函数的字节码。这限制了 hot_restart 在处理向闭包添加新变量或在现有类实例中添加方法时,但简化了实现。

super() 调用

hot_restart 将重新加载源中的 super() 重新写入为 super(type(self, self)。这防止了方法获取闭包变量 __class__,这在许多情况下会中断,但如果 super() 所在的位置没有定义 self,则此重写可能会失败。此限制可能在将来被取消。

为了解决这个问题,您可以使用 super() 的两参数形式手动。

闭包和嵌套函数

hot_restart会将旧闭包变量修补到新定义的函数中,前提是hot_restart.wrap是最内层的装饰器。然而,函数不能在没有完全重新加载模块的情况下添加新的闭包变量。函数仍然可以获取新的参数。

对于嵌套函数,hot_restart.wrap_module()无法找到内部函数,因此必须手动使用hot_restart.wrap()

如果hot_restart.wrap不是最内层的装饰器,那么闭包变量将会丢失。

替代/补充工具

如果您只想实现更完整的即时重载(例如,为现有类的实例添加新方法的能力),您应该考虑使用jurigged。您也应该能够与hot_restart一起使用jurigged。如果您想使用jurigged的代码重载与hot_restart的功能重启结合,您可以通过设置来禁用hot_restart的自动代码重载:

hot_restart.RELOAD_ON_CONTINUE = False

本模块实现了一个类似于“编辑并继续”的工作流程。如果您正在寻找具有IDE集成的更全面的工作流程实现,您可能对Reloadium感兴趣。

尽管存在这些有用的替代方案,但我创建了hot_restart,因为我发现很难调试那些系统中的故障。hot_restart有意实现了一组更简洁的重载例程,我可以轻松理解。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

hot_restart-0.2.1.tar.gz (13.2 kB 查看哈希值)

上传时间

构建分发

hot_restart-0.2.1-py2.py3-none-any.whl (11.0 kB 查看哈希值)

上传时间 Python 2 Python 3

支持者:

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面