Como se indica en los comentarios, inspect.getsource
no funcionará porque depende del archivo original (es decir, module.__file__
).
Mejor opción:verifica si hay un .pyc
archivo (por ejemplo, foo.pyc
debe estar al lado de foo.py
). Si lo hay, puede usar Decompile Python 2.7 .pyc para descompilarlo.
Los inspect
Los módulos también almacenan en caché la fuente. Es posible que puedas tener suerte y usar inspect.getsource(module)
o inspect.getsourcelines(module.function)
si ha sido llamado en el pasado.
De lo contrario, deberá reconstruir el módulo "manualmente" inspeccionando las exportaciones (es decir, module.__globals__
). Las constantes y otras cosas son obvias, y para funciones puedes usar func.func_name
para obtener su nombre, func.__doc__
para obtener la cadena de documentación, inspect.getargspec(func)
para obtener los argumentos, y func.func_code
para obtener detalles sobre el código:co_firstlineno
obtendrá el número de línea, luego co_code
obtendrá el código. Hay más información sobre cómo descompilar eso aquí:Exploración y descompilación del código de bytes de Python
Por ejemplo, para usar uncompyle2
:
>>> def foo():
... print "Hello, world!"
...
>>> from StringIO import StringIO
>>> import uncompyle2
>>> out = StringIO()
>>> uncompyle2.uncompyle("2.7", foo.func_code, out=out)
>>> print out.getvalue()
print 'Hello, world!'
Pero no, no conozco ningún método más directo para tomar un módulo y recuperar el código fuente.