Je réalise que cette réponse a 4 ans de retard, mais les réponses existantes induisent les gens en erreur.
La bonne façon de faire n'est jamais __file__
ou en essayant de marcher à travers sys.path
et chercher par vous-même, etc. (sauf si vous avez besoin d'être rétrocompatible au-delà de la 2.1).
C'est le inspect
en particulier, getfile
o getsourcefile
.
À moins que vous ne souhaitiez apprendre et mettre en œuvre les règles (qui sont documentées, mais douloureuses, pour CPython 2.x, et pas du tout documentées pour les autres implémentations, ou 3.x) pour le mappage de .pyc
à .py
traiter les archives .zip, les œufs et les paquets de modules ; essayer différentes manières d'obtenir le chemin d'accès à .so
/ .pyd
qui ne prennent pas en charge __file__
; comprendre ce que font Jython/IronPython/PyPy ; etc. Dans ce cas, allez-y.
Entre-temps, les sources de chaque version de Python depuis la 2.0+ sont disponibles en ligne à l'adresse suivante http://hg.python.org/cpython/file/X.Y/
(par exemple, 2.7 o 3.3 ). Donc, une fois que vous avez découvert que inspect.getfile(datetime)
est un .so
o .pyd
comme /usr/local/lib/python2.7/lib-dynload/datetime.so
vous pouvez le consulter dans le répertoire Modules. À proprement parler, il n'y a aucun moyen d'être sûr de quel fichier définit quel module, mais presque tous sont soit foo.c
o foomodule.c
donc il ne devrait pas être difficile de deviner que datetimemodule.c est ce que vous voulez.