Me doy cuenta de que esta respuesta lleva 4 años de retraso, pero las respuestas existentes son engañosas.
La forma correcta de hacerlo es nunca __file__
, o tratar de caminar sys.path
y buscar por ti mismo, etc. (a menos que necesites ser compatible con versiones anteriores más allá de 2.1).
Es el inspect
módulo, en particular, getfile
o getsourcefile
.
A menos que desee aprender e implementar las reglas (que están documentadas, pero son dolorosas, para CPython 2.x, y no están documentadas en absoluto para otras implementaciones, o 3.x) para la asignación .pyc
a .py
archivos; tratar con archivos .zip, huevos y paquetes de módulos; probando diferentes formas de obtener la ruta a .so
/ .pyd
archivos que no son compatibles __file__
; averiguar qué hacen Jython / IronPython / PyPy; En cuyo caso, hazlo.
Mientras tanto, la fuente de cada versión de Python desde 2.0+ está disponible en línea en http://hg.python.org/cpython/file/X.Y/
(por ejemplo, 2.7 o 3.3 ). Entonces, una vez que descubra que inspect.getfile(datetime)
es un archivo .so
o , puede buscarlo dentro del directorio Módulos. Estrictamente hablando, no hay forma de estar seguro de qué archivo define qué módulo, pero casi todos son o , por lo que no debería ser difícil adivinar que datetimemodule.c es lo que desea..pyd
/usr/local/lib/python2.7/lib-dynload/datetime.so
foo.c
foomodule.c