Have you accidentally deleted an important Python source file or are looking to inspect the contents of a .pyc file that has been provided to you? Luckily .pyc files contain enough information to reproduce the corresponding .py file. You won’t get the original comments or the original formatting, and there may be a few tweaks you need to do for the new .py file to be completely valid–but this can be a savior for some unexpected loss of source files if the .pyc files still exist.

The best way I have found to do this is pycdc (you can find the github here).

To build the C++ executables do the following steps. You must have cmake installed.

git clone https://github.com/zrax/pycdc.git
cd pycdc
cmake .
make

Once pycdc is built you can use it in the following manner to produce a .py file from a .pyc file:

path/to/pycdc path/to/file_of_interest.pyc > file_of_interest.py

In cases where I have functions that accept arbitrary keyword arguments with **kwargs and pass those on to subsequent functions in the same way, I have to convert **None syntax back to **kwargs within the decompiled Python code.

# Decompiled output
def myfunc(**kwargs):
    result = otherfunc(**None)
    return result

# Should be changed to
def myfunc(**kwargs):
    result = otherfunc(**kwargs)
    return result