首先,项目必须在运行,代码必须驻留在内存中

安装GDB(pyrasite需要)

apt-get update && apt-get install gdb

安装pyrasite,它让你能够跟正在运行的进程通信

pip install pyrasite

安装uncomplyle6,它能让你获取内存中存在的对象的源代码

pip install uncompyle6

找到正在运行的进程的PID

ps aux | grep python

使用pyrasite附着一个交互提示符

pyrasite-shell <PID>

现在你在交互终端中了,导入你要恢复的代码

>>> from my_package import my_module

找出你需要恢复的函数和类

>>> dir(my_module)
['MyClass', 'my_function']

把函数源代码提取出来

>>> import uncompyle6
>>> import sys
>>> uncompyle6.main.uncompyle(2.7, my_module.my_function.func_code, sys.stdout
)
# uncompyle6 version 2.9.10
# Python bytecode 2.7
# Decompiled from: Python 2.7.12 (default, Nov 19 2016, 06:48:10)
# [GCC 5.4.0 20160609]
# Embedded file name: /srv/my_package/my_module.py
function_body = "appears here"

对于类,你需要逐个提取每一个方法的文档

>>> uncompyle6.main.uncompyle(2.7, my_module.MyClass.my_method.im_func.func_code, sys.stdout
)
# uncompyle6 version 2.9.10
# Python bytecode 2.7
# Decompiled from: Python 2.7.12 (default, Nov 19 2016, 06:48:10)
# [GCC 5.4.0 20160609]
# Embedded file name: /srv/my_package/my_module.py
class_method_body = "appears here"

举例说明:

假如现在已经用如下命令进入到了交互模式(注意:你要首先cd到你项目所在的目录)

pyrasite-shell <PID>

我的代码有一个xmlparser模块,这个模块代码里面有个XmParser类,我现在想恢复这个类里面的方法

>>> import xmlparser
>>> dir(xmlparser.XmlParser)

打印的结果为:

['__abstractmethods__', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__metaclass__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_abc_cache', '_abc_negative_cache', '_abc_negative_cache_version', '_abc_registry', 'getContentAppendStr', 'getSummarPicStr', 'handleContent', 'handleSpecialModuleActor', 'handleSpecialModuleConcert', 'handleSpecialModuleMovieAndTv', 'handleSpecialModuleMusic', 'handleSpecialModulePlot', 'handleSpecialModuleRole', 'handleSpecialModuleStaff', 'handleSpecialModuleVariety', 'handleSpecialModules', 'obtainAbstract', 'obtainAmbiTitle', 'obtainBaseinfo', 'obtainContent', 'obtainKeywords', 'obtainLemmaStatistic', 'obtainPolysemantList', 'obtainReference', 'obtainTags', 'obtainTitle', 'removeTagWithOutSup', 'retainSupAndBr']

可以看到,这是这个类里面的所有方法,接下来就可以反编译得到指定方法的代码了,比如我想得到obtainAmbiTitle的代码

uncompyle6.main.decompile(2.7, xmlparser.XmlParser.obtainAmbi.func_code, sys.stdout)

上述命令的执行结果为:

# uncompyle6 version 2.15.0
# Python bytecode 2.7
# Decompiled from: Python 2.7.5 (default, Nov  6 2016, 00:28:07)
# [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
# Embedded file name: /search/data2/dlj/work/baiduHtmlExtract-dev/xmlparser.py
ul = doc.select('ul.polysemantList-wrapper.cmn-clearfix')
if ul:sele = ul[0].select('span.selected')if sele:return RuleUtils.standardHtmlEscape(sele[0].text.strip())<uncompyle6.semantics.pysource.SourceWalker object at 0x1f2d790>ul = doc.select('ul.polysemantList-wrapper.cmn-clearfix')
if ul:sele = ul[0].select('span.selected')if sele:return RuleUtils.standardHtmlEscape(sele[0].text.strip())<uncompyle6.semantics.pysource.SourceWalker object at 0x1f2d790>

如上黑体部分就是代码了

有的时候我们想得到的不是类的方法,而是某个变量,那么可以直接跟pdb的时候一样,比如我想知道xmlparser模块中的变量escapeRex的值,可以如下:

>>>import xmlparser
>>>print xmlparser.excapeRex

其实就跟我们在pdb中调试的时候获取变量的值有点类似

Python如何从内存中找回源代码相关推荐

  1. python获取系统内存占用信息的实例方法

    psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息.它主要应用于系统监控, ...

  2. python processpoolexector 释放内存_关于python:如何在multiprocessing.queue中从Process中释放内存?...

    我有一个程序试图预测一周内发送的每封电子邮件的电子邮件转换(因此,通常是7封). 输出是7个不同的文件,每个客户的预测得分. 串行运行这些可能需要8个小时,因此我尝试使用multiprocessing ...

  3. python 字典操作 内存占用,python - 如何强行释放字典使用的内存? - SO中文参考 - www.soinside.com...

    我正在研究一个Python脚本,该脚本查询几个不同的数据库以整理数据并将所述数据持久保存到另一个数据库.该脚本从大约15个不同数据库中的数百万条记录中收集数据.为了尝试加快脚本速度,我提供了一些缓存功 ...

  4. 什么是 Python 的 「内存管理机制」?

    什么是内存管理器(what) Python作为一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言,与大多数编程语言不同,Python中的变量无需事先申明,变量无需指定类型,程序员无需关心内存 ...

  5. [转] python运行时内存分析工具meliae

    转自:https://my.oschina.net/markco/blog/601773 利用meliae来监控python进程的内存占用情况 meliae是一个python进程内存占用监控.分析工具 ...

  6. Python如何进行内存管理?

    Python中主要通过引用计数和内存池机制进行内存管理. 一.引用计数机制 Python内部使用引用计数(记录对象有多少个引用)来保持追踪内存中的对象,当对象被创建时,该对象的引用计数加1;当对象被销 ...

  7. python变量分配内存_Python | 声明任何变量而不分配任何值

    python变量分配内存 Since, Python is a dynamic programming language so there is no need to declare such typ ...

  8. python 内存分析工具_[转] python运行时内存分析工具meliae

    meliae是一个python进程内存占用监控.分析工具,它的安装需要依赖pyrex包. 一.安装: 安装python内存分析工具 sudo pip install cython sudo pip i ...

  9. 【Python】Python3.7.3 源代码编译安装 CentOS

    文章目录 系统参考 CentOS安装先决条件包 下载并解压Python 3.7.3的源代码包 配置源代码 编译并安装 检查Python版本 升级pip 系统参考 CentOS的epel仓库中还没有Py ...

最新文章

  1. 一个完整的操作UI线程的例子,用到了多种方式
  2. asp.net web 开发登录相关操作的控件LoginName、LoginStatus和LoginView控件使用详解
  3. Firefox联手Chrome合作开发网页VR标准
  4. 深入理解python.md_linux-深入理解python.pdf
  5. GPU云服务器+tensorboard
  6. linux查服务器总内存大小,在linux 下怎么查看服务器的cpu和内存的硬件信息
  7. python对excel表统计视频教程_Python实现对excel文件列表值进行统计的方法
  8. linux的find命令满屏权限不够提示
  9. Spring Boot Starter 常用列表
  10. 银行离开IBM必死?国货10年内无法接盘
  11. egg extend ts_电竞5.21日王者荣耀KPL分析:DYG冲击西部榜首,TS战队能否虐菜?
  12. 十年,从网管到首席架构师,我的成长感悟
  13. 解决办法:error LNK2005: void * __cdecl operator new(unsigned int) 已经在 LIBCMTD.lib(new.obj) 中定义
  14. Ms08067 de 阿青姐姐告诉你为什么要学Python内网开发,不看是你的损失!
  15. [dlang](二)用vibe.d+thrift做网络编程
  16. 华为ensp搭建习题
  17. 数据结构----栈和队列
  18. be going to用法口诀
  19. 一起感受迪士尼乐园的奇幻魔力 高德地图迪士尼圆梦之旅圆满成功
  20. 《Java入门》简化的插入排序:本题要求编写程序,将一个给定的整数插到原本有序的整数序列中,使结果序列仍然有序。

热门文章

  1. el-table——可合并单元格的表格
  2. [图论]最短路计数(spfa)
  3. scrapy_redis项目配置
  4. Layui导航、面包屑
  5. c语言的详细编译过程
  6. oracle更新视图。
  7. 性能测试基础之JMeter聚合报告详解
  8. jenkins pipeline之如何创建一个流水线
  9. raster | R语言中的空间栅格对象及其基本处理方法(Ⅰ)
  10. shiro 升级_小米11消息再次确认:骁龙875有独占期,超广角镜头大升级