2008-11-06 14 views

Respuesta

286

Para obtener un módulo de python puro, puede encontrar la fuente mirando themodule.__file__. Sin embargo, el módulo de fecha y hora está escrito en C y, por lo tanto, datetime.__file__ apunta a un archivo .so (no hay datetime.__file__ en Windows) y, por lo tanto, no puede ver la fuente.

Si descarga un archivo tarball python y lo extrae, el código de los módulos se puede encontrar en el subdirectorio Modules.

Por ejemplo, si usted quiere encontrar el código de fecha y hora para Python 2.6, se puede ver en

Python-2.6/Modules/datetimemodule.c 

También puede encontrar la última versión de Mercurial en la web en https://hg.python.org/cpython/file/tip/Modules/_datetimemodule.c

+0

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. –

+0

En realidad, en Windows (al menos en la versión que estoy usando), datetime simplemente no tiene un atributo __file__. –

36

La lista sys.path contiene la lista de directorios que se han buscado módulos en tiempo de ejecución:

python -v 
>>> import sys 
>>> sys.path 
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ] 
+1

Gran! Justo lo que estaba buscando. –

+5

'' 'python -c 'import sys; print "\ n" .join (sys.path) ''' 'te permitirá verlo sin tener que pasar a la python interactiva. –

175

Correr python -v desde la línea de comandos debe decirle que se importan y desde dónde. Esto funciona para mí en Windows y Mac OS X.

C:\>python -v 
# installing zipimport hook 
import zipimport # builtin 
# installed zipimport hook 
# C:\Python24\lib\site.pyc has bad mtime 
import site # from C:\Python24\lib\site.py 
# wrote C:\Python24\lib\site.pyc 
# C:\Python24\lib\os.pyc has bad mtime 
import os # from C:\Python24\lib\os.py 
# wrote C:\Python24\lib\os.pyc 
import nt # builtin 
# C:\Python24\lib\ntpath.pyc has bad mtime 
... 

¡No estoy seguro de cuáles son esos malos mtime en mi instalación!

+6

¡Genial! También puede escribir su propia declaración de importación específica después de que se abra en modo interactivo para ver de dónde viene la lib específica. – scorpiodawg

+1

¿Dónde están los módulos 'built-in'? – loretoparisi

27

datetime es un módulo integrado, por lo que no hay ningún archivo de origen (Python).

Para los módulos procedentes de .py (o .pyc) archivos, puede usar mymodule.__file__, p. Ej.

> import random 
> random.__file__ 
'C:\\Python25\\lib\\random.pyc' 
0

No todos los módulos de python están escritos en python. Fecha y hora es uno de ellos que no es, y (en Linux) es datetime.so.

Tendría que descargar el código fuente a la biblioteca estándar de Python para obtenerlo.

+0

Quiere decir, por supuesto, que la fecha y hora no está escrita en Python. –

+2

Daryl: Error al interpretar la respuesta de Jim, "Datetime pasa a ser uno de los módulos de Python no escritos en python". –

8

Salida este nifty "cdp" command a cd al directorio que contiene el código fuente del módulo de Python se indica:

cdp() { 
    cd "$(python -c "import os.path as _, ${1}; \ 
    print _.dirname(_.realpath(${1}.__file__[:-1]))" 
)" 
} 
+0

Gracias! Es justo lo que estaba buscando. Curiosamente, no incluirían algo así en la distribución de Python. –

10

En el intérprete python puede importar el módulo particular y luego escribir help (módulo). Esto proporciona detalles tales como Nombre, Archivo, Módulo Documentos, Descripción et al.

Ex:

import os 

help(os) 


Help on module os: 

NAME 

os - OS routines for Mac, NT, or Posix depending on what system we're on. 

FILE 

/usr/lib/python2.6/os.py 

MODULE DOCS 

http://docs.python.org/library/os 

DESCRIPTION 

This exports: 

- all functions from posix, nt, os2, or ce, e.g. unlink, stat, etc. 

- os.path is one of the modules posixpath, or ntpath 

- os.name is 'posix', 'nt', 'os2', 'ce' or 'riscos' 

et al

+0

Esto me dio una ruta completa al archivo del módulo mientras que otras respuestas solo dieron rutas relativas. Gracias. – Jerther

98

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.

+3

¿Por qué el archivo '__file__' no es aplicable para los builtins? Entiendo que el rastreo de sys.path puede ser doloroso (especialmente sin conocer meta_path), pero ¿le preocupa el espacio de nombres entre las definiciones y los binarios de '__file__'? –

+0

Hago esto en 2.7.8 en datetime y simplemente obtengo un TypeError para getfile y getourcefile. Personalmente, tengo varias versiones de python instaladas y necesito saber a qué versión de datetimemodule.c apunta, porque ahora sé que no está apuntando a la que debe apuntar dada la versión de intérprete que se está ejecutando ... – mmitchell

+0

@ mmitchell: si obtiene un TypeError de inspect.getfile (datetime), suponiendo que datetime es realmente el módulo y no otra cosa que haya asignado al mismo nombre, estoy bastante seguro de que eso significa que ha creado una compilación personalizada para que esté estáticamente enlace en datetime al intérprete en lugar de hacerlo un módulo cargable. Pero podría haber otras razones por las que no había pensado. Necesitas hacer una nueva pregunta y dar mucha más información para reproducir esto. – abarnert

5

Aquí hay una sola línea para obtener el nombre de archivo para un módulo, adecuado para la cáscara de aliasing:

echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)' | python - 

configurado como un alias:

alias getpmpath="echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)' | python - " 

Para usar:

[[email protected] ~]$ getpmpath twisted 
/usr/lib64/python2.6/site-packages/twisted/__init__.pyc 
[[email protected] ~]$ getpmpath twisted.web 
/usr/lib64/python2.6/site-packages/twisted/web/__init__.pyc 
22

de la biblioteca estándar try imp.find_module

>>> import imp 
>>> imp.find_module('fontTools') 
(None, 'C:\\Python27\\lib\\site-packages\\FontTools\\fontTools', ('', '', 5)) 
>>> imp.find_module('datetime') 
(None, 'datetime', ('', '', 6)) 
+0

Esto es fantástico. I 'apt-get remove'd DataDog y todavía podría importarlo. Esto me ayudó a encontrar dónde estaban los archivos (para poder eliminarlos) cuando las otras soluciones no me ayudaron. –

4

En las ventanas se puede encontrar la ubicación del módulo de Python como se muestra a continuación: es decir, encontrar el módulo rest_framework enter image description here

0

Para aquellos que prefieren una solución de interfaz gráfica de usuario: si está utilizando una interfaz gráfica de usuario, tales como Spyder (parte de la instalación de Anaconda) puede simplemente hacer clic derecho en el nombre del módulo (como "csv" en "importar csv") y seleccionar "ir a definición" - esto abrirá el archivo, pero también en la parte superior se puede ver el ubicación del archivo ("C: .... csv.py")

26

Si está utilizando pip para instalar sus módulos, solo pip show $module se devuelve la ubicación.

+0

sin signo de dólar para mí. p.ej. 'pip show numpy' –

0

En Ubuntu 12.04, por ejemplo, el paquete de numpy python2, se puede encontrar en:

/usr/lib/python2.7/dist-packages/numpy 

Por supuesto, esto no es la respuesta genérica

Cuestiones relacionadas