Skip to content

Instantly share code, notes, and snippets.

@simonw
Last active June 21, 2024 00:11
Show Gist options
  • Save simonw/8aa492e59265c1a021f5c5618f9e6b12 to your computer and use it in GitHub Desktop.
Save simonw/8aa492e59265c1a021f5c5618f9e6b12 to your computer and use it in GitHub Desktop.
How to recover lost Python source code if it's still resident in-memory

How to recover lost Python source code if it's still resident in-memory

I screwed up using git ("git checkout --" on the wrong file) and managed to delete the code I had just written... but it was still running in a process in a docker container. Here's how I got it back, using https://pypi.python.org/pypi/pyrasite/ and https://pypi.python.org/pypi/uncompyle6

Attach a shell to the docker container

Install GDB (needed by pyrasite)

apt-get update && apt-get install gdb

Install pyrasite - this will let you attach a Python shell to the still-running process

pip install pyrasite

Install uncompyle6, which will let you get Python source code back from in-memory code objects

pip install uncompyle6

Find the PID of the process that is still running

ps aux | grep python

Attach an interactive prompt using pyrasite

pyrasite-shell <PID>

Now you're in an interactive prompt! Import the code you need to recover

>>> from my_package import my_module

Figure out which functions and classes you need to recover

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

Decompile the function into source code

>>> 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"

For the class, you'll need to decompile each method in turn

>>> 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"
@tom-flamelit
Copy link

You just hit front page of hacker news!

Does this still work with recent Python versions?

@tg12
Copy link

tg12 commented May 17, 2024

process in a docker container.

Why could you not just jump in the docker container and copy the python file out?

@Alshly-blip
Copy link

Why been in a relationship without rest of mind. always feeling like your been cheated on. i have been married for 7 years now but for couple of months i notice some unusual change in my husband activities like late night calls, hiding messages, delete photos and many more but when i try to talk to him about it, he complains i nag a lot so i decided to hire a genuine hacker which i got introduced to Remote spy hacker . After couple of hours with this expert , i was able to gain access to my partner phone without any physical touch . i got to see his hidden messages, social media, gallery , call recordings and more. anyone in need of a genuine hacker can reach out to [ Remote spy hacker @ g(m)ail . c0m ]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment