Come notato nei commenti, inspect.getsource
non funzionerà perché dipende dal file originale (ad esempio, module.__file__
).
Opzione migliore:controlla se c'è un .pyc
file (es, foo.pyc
dovrebbe essere accanto a foo.py
). Se c'è, puoi usare Decompile Python 2.7 .pyc per decompilarlo.
Il inspect
i moduli memorizzano anche nella cache l'origine. Potresti essere fortunato e usare inspect.getsource(module)
o inspect.getsourcelines(module.function)
se è stato chiamato in passato.
Altrimenti dovrai ricostruire il modulo "manualmente" ispezionando le esportazioni (ad esempio, module.__globals__
). Le costanti e quant'altro sono ovvie, e per le funzioni puoi usare func.func_name
per ottenere il suo nome, func.__doc__
per ottenere la docstring, inspect.getargspec(func)
per ottenere gli argomenti e func.func_code
per ottenere dettagli sul codice:co_firstlineno
otterrà il numero di riga, quindi co_code
otterrà il codice. C'è di più sulla decompilazione qui:Exploring and decompiling python bytecode
Ad esempio, per utilizzare 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!'
Ma no, non sono a conoscenza di un metodo più diretto per prendere un modulo e recuperare il codice sorgente.