ChatGPT解决这个技术问题 Extra ChatGPT

Is it possible to decompile a compiled .pyc file into a .py file?

Is it possible to get some information out of the .pyc file that is generated from a .py file?


R
RichVel

Uncompyle6 works for Python 3.x and 2.7 - recommended option as it's most recent tool, aiming to unify earlier forks and focusing on automated unit testing. The GitHub page has more details.

If you use Python 3.7+, you could also try decompyle3, a fork of Uncompyle6 focusing on 3.7 and higher.

Do raise GitHub issues on these projects if needed - both run unit test suites on a range of Python versions.

With these tools, you get your code back including variable names and docstrings, but without the comments.

The older Uncompyle2 supports Python 2.7 only. This worked well for me some time ago to decompile the .pyc bytecode into .py, whereas unpyclib crashed with an exception.

Preventing this in future

See this answer for some tips that may work in your editor or IDE, including VS Code.


Thanks a lot. I had accidentally deleted my .py file instead of .pyc. This saved me from having to rewrite it from scratch.
For those of you here because you accidentally deleted the wrong file, I highly recommend source control!
^ And if you're using PyCharm, you can right-click your file/folder in the Project pane and goto Local History > Show History to revert changes. Life saver.
uncompyle6 is also available online at decompiler.com
I've added a link to a new answer explaining how to undelete files in some editors and IDEs.
E
Extreme Coders

You may try Easy Python Decompiler. It's based on Decompyle++ and Uncompyle2. It's supports decompiling python versions 1.0-3.3

Note: I am the author of the above tool.


It does its job. Good work. BTW, did you write this tool in python?
Worked well for me (easy drag and drop). It's true that a linux distro would be nice, but its not all that hard opening a windows box.
Last release in 2015 and looks like it's closed source?
@MacGyver Sorry but these days you can't a trust link sourceforge or not, even it's a well known domain. The answer is from 2014 when https wasn't mandatory. Yes sourceforge track record has indeed gone south and I had stopped using sourceforge a long time ago.
No worries. Not discrediting you. I just didn't want others to get trojens, malware, spyware, viruses, or any other internet misdemeanors. :)
P
Pokutnik

Yes, you can get it with unpyclib that can be found on pypi.

$ pip install unpyclib

Than you can decompile your .pyc file

$ python -m unpyclib.application -Dq path/to/file.pyc

I tried this and it crashed with an exception, on quite a small file with no complex code (Django settings.py) - uncompyle2 worked fine instead. -1 for that reason.
It crashed in Python 3.6 in lib\site-packages\unpyclib\applcation.py with print __copyright -- why is it using the Python 2.7 version of print without parenthesis?
@DavidChing unpyclib's first and last release was in 2009, safe to say it's a Python 2 only program.
c
crifan

Yes.

I use uncompyle6 decompile (even support latest Python 3.8.0):

uncompyle6 utils.cpython-38.pyc > utils.py

and the origin python and decompiled python comparing look like this:

https://i.stack.imgur.com/Zw0aN.jpg

so you can see, ALMOST same, decompile effect is VERY GOOD.


same experience here. uncompyle6 is incredible.
C
Community

Decompyle++ (pycdc) was the only one that worked for me: https://github.com/zrax/pycdc

was suggested in Decompile Python 2.7 .pyc


And this worked for me for code that was compiled with Python 2.6!
D
Dharman

I've been at this for a couple hours and finally have a solution using Decompyle++:

visit https://cmake.org/download/ and install CMake.

visit https://github.com/zrax/pycdc and grab a copy of this repo: pycdc-master.

add C:\Program Files\CMake\bin to your system environment variables under PATH.

I suggest putting your pycdc-master folder into another folder, like anotherFolder.

Now you can run these commands in the command line:

cd anotherFolder to go into the folder that has pycdc-master in it.

cmake pycdc-master

cd ../ to go up one directory,

then: cmake --build anotherFolder

pycdc.exe will then be in anotherFolder\Debug.

Do something like pycdc.exe onlyhopeofgettingmycodeback.pyc in a console and it will print out the source code. I had Python 3.9.6 source code and nothing else was working.


Usually you create the build folder inside the repo and then inside the build folder you call cmake ..
G
G_M

Yes, it is possible.

There is a perfect open-source Python (.PYC) decompiler, called Decompyle++ https://github.com/zrax/pycdc/

Decompyle++ aims to translate compiled Python byte-code back into valid and human-readable Python source code. While other projects have achieved this with varied success, Decompyle++ is unique in that it seeks to support byte-code from any version of Python.


While pycdc is good, it is not perfect. If you look at github.com/zrax/pycdc/issues there are over 50 individual types of problems it has in decompilation. This is however spread over the 16 or so releases of python, and both the language and code has changed drastically. It may be that for the things you have tried you haven't been able to find a problem. However, in my opinion, to classify something as "perfect", one would have to take say the entire Python library for each version, decompile it, and have it pass its own tests properly. No decompiler can do that yet.
B
Banik Kuntal

Install using pip install pycompyle6

pycompyle6 filename.pyc


C
CLipp

If you need to decompile a pyc but have python 3.9 installed you can force uncompyle6 to run. It's not perfect but it does work. Just edit site-packages\uncompyle6\bin\uncompile.py

def main_bin():
if not (sys.version_info[0:2] in ((2, 6), (2, 7), (3, 0),
                                  (3, 1), (3, 2), (3, 3),
                                  (3, 4), (3, 5), (3, 6),
                                  (3, 7), (3, 8), (3, 9)

Just add the version you have installed in the same format as the others and save. It will at least run.


It does not decompile pyc made with python3.9