44

I've searched up and down, but can't find a de-compiler that will work for Python 2.7 .pyc. Does anybody know of one that will work for Python 2.7? Thanks

DIDoS
  • 812
  • 9
  • 23
suffa
  • 3,606
  • 8
  • 46
  • 66

5 Answers5

85

In case anyone is still struggling with this, as I was all morning today, I have found a solution that works for me:

Uncompyle

Installation instructions:

git clone https://github.com/gstarnberger/uncompyle.git
cd uncompyle/
sudo ./setup.py install

Once the program is installed (note: it will be installed to your system-wide-accessible Python packages, so it should be in your $PATH), you can recover your Python files like so:

uncompyler.py thank_goodness_this_still_exists.pyc > recovered_file.py

The decompiler adds some noise mostly in the form of comments, however I've found it to be surprisingly clean and faithful to my original code. You will have to remove a little line of text beginning with +++ near the end of the recovered file to be able to run your code.

Milosz
  • 2,924
  • 3
  • 22
  • 24
  • 5
    Saved my bacon! I'll be adding it to my virtualenvs from now on... – kaleissin Jun 28 '12 at 10:01
  • 5
    Saved my bacon too. I was such a genius running rm *.py to cleanup my pyc files before commiting to git. But at least it left me with my .pyc files in a beautiful bit of irony. – Eloff Aug 20 '12 at 20:46
  • 2
    @Eloff A .gitignore file containing *.pyc would be easier than having to be mindful about deleting *.pyc before each commit! Could be that you know that and are mildly obsessive about having a clean environment though, as many programmers tend to be :D – Milosz Aug 28 '12 at 17:03
  • 2
    Thanks for sharing this. Had to convince my boss that its not worth it to hide .py code files.. Now he's believing me ;). – Prine Dec 06 '12 at 12:18
  • 1
    another soul saved here! – daigorocub Feb 08 '13 at 14:28
  • 1
    Recommend the uncompyle2 fork of this 0 works on Python 2.7 for me: https://github.com/wibiti/uncompyle2 – RichVel Feb 11 '13 at 08:30
  • I know it's a meaningless comment -- but a "thank you!!" from me as well ) – ジョージ Jun 05 '13 at 08:13
  • Does this support Python 3? – Samuel Katz Jun 09 '13 at 11:56
  • 1
    @SalmanPK no, unfortunately this was written for Python 2.7 exclusively. Someone here is working on a Python 3 decompiler, but it is still experimental: https://code.google.com/p/unpyc3/ – Milosz Jun 17 '13 at 18:33
  • This saved me from an online course's ridiculous way of asserting that you've set up your environment correctly. They bundled a PYC file to make sure you couldn't read the source code to make sure numpy and matplotlib are installed! Clever, but annoying. – Asim Ihsan Mar 06 '14 at 18:25
  • Online version of this decompiler is available here: http://www.javadecompilers.com/pyc – Andrew Rukin Jul 17 '16 at 09:25
26

Decompyle++ (pycdc) appears to work for a range of python versions: https://github.com/zrax/pycdc

For example:

git clone https://github.com/zrax/pycdc   
cd pycdc
make  
./bin/pycdc Example.pyc > Example.py
Dogbert
  • 212,659
  • 41
  • 396
  • 397
Erik
  • 261
  • 3
  • 2
21

UPDATE (2019-04-22) - It sounds like you want to use uncompyle6 nowadays rather than the answers I had mentioned originally.

This sounds like it works: http://code.google.com/p/unpyc/

Issue 8 says it supports 2.7: http://code.google.com/p/unpyc/updates/list

UPDATE (2013-09-03) - As noted in the comments and in other answers, you should look at https://github.com/wibiti/uncompyle2 or https://github.com/gstarnberger/uncompyle instead of unpyc.

Mike Driscoll
  • 32,629
  • 8
  • 45
  • 88
10

Here is a great tool to decompile pyc files.

It was coded by me and supports python 1.0 - 3.3

Its based on uncompyle2 and decompyle++

http://sourceforge.net/projects/easypythondecompiler/

Extreme Coders
  • 3,441
  • 2
  • 39
  • 55
3

Ned Batchelder has posted a short script that will unmarshal a .pyc file and disassemble any code objects within, so you'll be able to see the Python bytecode. It looks like with newer versions of Python, you'll need to comment out the lines that set modtime and print it (but don't comment the line that sets moddate).

Turning that back into Python source would be somewhat more difficult, although theoretically possible. I assume all these programs that work for older versions of Python do that.

Michael Hoffman
  • 32,526
  • 7
  • 64
  • 86