Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

retrieve source code from code object as returned by compile()

448 views
Skip to first unread message

Justin Ezequiel

unread,
Apr 23, 2014, 8:58:38 PM4/23/14
to
Is there a way to get the original source?
I am trying to retrieve the main script from a py2exe'd old program.
The programmer neglected to commit to SVN before leaving.

Using "Easy Python Decompiler" I am able to get the source for the imported modules.
Using "Resources Viewer" from PlexData and some code I am able to retrieve the code object. I am however stumped as to how to retrieve the source from this code object.

PythonWin 2.5.4 (r254:67916, Dec 23 2008, 15:10:54) [MSC v.1310 32 bit (Intel)] on win32.
Portions Copyright 1994-2008 Mark Hammond - see 'Help/About PythonWin' for further copyright information.
>>> s = 'import time\nprint time.time()\n'
>>> c = compile(s, 'foo.py', 'exec')
>>> exec(c)
1398299623.77
>>> c
<code object <module> at 01E5C5C0, file "foo.py", line 1>
>>> for n in dir(c):
... if n.startswith('_'): continue
... print n
... a = getattr(c, n)
... print type(a)
... print `a`
... print
...
co_argcount
<type 'int'>
0

co_cellvars
<type 'tuple'>
()

co_code
<type 'str'>
'd\x00\x00d\x01\x00k\x00\x00Z\x00\x00e\x00\x00i\x00\x00\x83\x00\x00GHd\x01\x00S'

co_consts
<type 'tuple'>
(-1, None)

co_filename
<type 'str'>
'foo.py'

co_firstlineno
<type 'int'>
1

co_flags
<type 'int'>
64

co_freevars
<type 'tuple'>
()

co_lnotab
<type 'str'>
'\x0c\x01'

co_name
<type 'str'>
'<module>'

co_names
<type 'tuple'>
('time',)

co_nlocals
<type 'int'>
0

co_stacksize
<type 'int'>
2

co_varnames
<type 'tuple'>
()
>>> len(s)
30
>>> len(c.co_code)
27
>>>

Gregory Ewing

unread,
Apr 24, 2014, 1:53:38 AM4/24/14
to
Justin Ezequiel wrote:
> Using "Easy Python Decompiler" I am able to get the source for the imported
> modules. Using "Resources Viewer" from PlexData and some code I am able to
> retrieve the code object. I am however stumped as to how to retrieve the
> source from this code object.

Easy Python Decompiler should be able to do that, but you
may need to delve into its innards a bit to find an entry
point where you can feed in a code object.

Alternatively you could create a .pyc file out of the code
object and then use Easy Python Decompiler on that. The
following snippet of code should do that:

import marshal
import py_compile
import time

with open('output.pyc', 'wb') as fc:
fc.write('\0\0\0\0')
py_compile.wr_long(fc, long(time.time()))
marshal.dump(codeobject, fc)
fc.flush()
fc.seek(0, 0)
fc.write(py_compile.MAGIC)

(Taken from:
http://stackoverflow.com/questions/8627835/generate-pyc-from-python-ast)

--
Greg

Justin Ezequiel

unread,
Apr 24, 2014, 10:50:15 PM4/24/14
to
On Thursday, April 24, 2014 1:53:38 PM UTC+8, Gregory Ewing wrote:
> Alternatively you could create a .pyc file out of the code
> object and then use Easy Python Decompiler on that. The
> following snippet of code should do that:
>
> (Taken from:
>
> http://stackoverflow.com/questions/8627835/generate-pyc-from-python-ast)

Woohoo! Success! Thank you Greg!

Amirouche Boubekki

unread,
Apr 25, 2014, 12:34:59 PM4/25/14
to Justin Ezequiel, python-list
in python3, I do inspect.getsource(object) [doc], I don't know the limitations.

On Python 2, there is meta.

My interest is different, I use to retrieve the definition of function to submit it to a database, instead of stored procedures, but I have the source of the code. It can also be used to retrieve the ast.


Gregory Ewing

unread,
Apr 25, 2014, 8:03:10 PM4/25/14
to
Amirouche Boubekki wrote:
> in python3, I do inspect.getsource(object) [doc
> <https://docs.python.org/3/library/inspect.html#inspect.getsource>], I
> don't know the limitations.

The limitation relevant here is that it requires the
original source file to be present. :-)

--
Greg
0 new messages