找回 Jupyter/Python 加载至内存中的源代码
本文参考另一篇博客。
但这篇文章里 Python 及各种库版本都较老,对于 Python3 文章里的命令大都不再适用了,且是针对更普遍的 python 程序的,本文主要讨论 jupyter 中的内存代码恢复。
起因是这样的,一个 Jupyter notebook 中 import
了自己的 module A.py 中的几个函数,后来一直在 jupyter 中工作,kernel 也没重启过,但回过头来突然发现 A.py 中的内容被我不小心用其他内容覆盖了。。考虑到 kernel 没有重启,现在代码其实还加载在内存中,于是开始想办法恢复。
首先安装必要的工具
pip install uncompyle6
这个 package 用于对 python 代码字节流进行反编译,但似乎是只有 CLI 没有 api 的,需要浏览源码找到反编译函数。
在 kernel 加载了待恢复代码的 Jupyter notebook 中运行
import uncompyle6
uncompyle6.main.decompile(3.8, target_function.__code__, sys.stdout)
即可显示反编译得到的代码结果,其中 target_function
是待恢复的函数,3.8
是 python 版本。
针对类或模块代码的恢复类似,可以参考文章开头给出的另一篇博客链接。对于非 ipython 或 jupyter 的 python 程序,则需要使用额外的工具,也可以参考这篇博客。