Comme indiqué dans les commentaires, inspect.getsource
ne fonctionnera pas car cela dépend du fichier d'origine (c'est-à-dire module.__file__
).
Meilleure option :vérifiez s'il y a un .pyc
fichier (ex, foo.pyc
devrait être à côté de foo.py
). Si c'est le cas, vous pouvez utiliser Decompile Python 2.7 .pyc pour le décompiler.
Le inspect
modules met également en cache la source. Vous pourrez peut-être avoir de la chance et utiliser inspect.getsource(module)
, ou inspect.getsourcelines(module.function)
s'il a été appelé dans le passé.
Sinon, vous devrez reconstruire le module "manuellement" en inspectant les exportations (c'est-à-dire module.__globals__
). Les constantes et autres sont évidentes, et pour les fonctions, vous pouvez utiliser func.func_name
pour obtenir son nom, func.__doc__
pour obtenir la docstring, inspect.getargspec(func)
pour obtenir les arguments, et func.func_code
pour obtenir des détails sur le code :co_firstlineno
obtiendra le numéro de ligne, puis co_code
obtiendra le code. Il y a plus sur la décompilation ici :Explorer et décompiler le bytecode Python
Par exemple, pour utiliser 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!'
Mais non - je ne connais aucune méthode plus simple pour prendre un module et récupérer le code source.