Soy consciente de que esta respuesta es de 4 años de retraso, pero las respuestas existentes son engañar a la gente.
La forma correcta de hacer esto nunca es __file__
, o tratando de caminar a través de sys.path
y búscalo tú mismo, etc. (a menos que necesites ser compatible con versiones anteriores más allá de 2.1).
Es el módulo inspect
-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 para otras implementaciones, o 3.x) para mapear .pyc
a .py
archivos; tratar con archivos .zip, huevos y paquetes de módulos; probando diferentes formas de obtener la ruta a los archivos .so
/.pyd
que no admiten __file__
; averiguar qué hacen Jython/IronPython/PyPy; etc. En cuyo caso, ve por ello.
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). Por lo tanto, una vez que descubra que inspect.getfile(datetime)
es un archivo .so
o .pyd
como /usr/local/lib/python2.7/lib-dynload/datetime.so
, puede buscarlo en el directorio de Módulos. Estrictamente hablando, no hay manera de estar seguro de qué archivo define qué módulo, pero casi todos son foo.c
o foomodule.c
, por lo que no debería ser difícil adivinar que datetimemodule.c es lo que desea.
Si edita su respuesta para indicar que datetime .__ file__ apunta a .so en Linux y Mac OS X (aunque en Windows el objeto del módulo datetime no tiene el atributo __file__), aceptaré su respuesta. –
En realidad, en Windows (al menos en la versión que estoy usando), datetime simplemente no tiene un atributo __file__. –