Wie in den Kommentaren vermerkt, inspect.getsource
funktioniert nicht, da es von der Originaldatei abhängt (d. h. module.__file__
).
Beste Option:Prüfen Sie, ob ein .pyc
vorhanden ist Datei (z. B. foo.pyc
sollte neben foo.py
stehen ). Wenn ja, können Sie Decompile Python 2.7 .pyc verwenden, um es zu dekompilieren.
Die inspect
module speichert auch die Quelle. Vielleicht haben Sie Glück und verwenden inspect.getsource(module)
, oder inspect.getsourcelines(module.function)
wenn es in der Vergangenheit aufgerufen wurde.
Andernfalls müssen Sie das Modul "manuell" neu erstellen, indem Sie die Exporte überprüfen (dh module.__globals__
). Konstanten und so weiter sind offensichtlich, und für Funktionen können Sie func.func_name
verwenden um seinen Namen zu erhalten, func.__doc__
um den Docstring zu erhalten, inspect.getargspec(func)
um die Argumente zu erhalten, und func.func_code
um Details über den Code zu erhalten:co_firstlineno
erhält die Zeilennummer, dann co_code
bekommt den Code. Mehr zum Thema Dekompilieren finden Sie hier:Exploring and decompiling python bytecode
Zum Beispiel, um uncompyle2
zu verwenden :
>>> 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!'
Aber nein – mir ist keine einfachere Methode bekannt, um ein Modul zu nehmen und den Quellcode wieder herauszuholen.