¿Cómo encuentro la ubicación de las fuentes del módulo Python?

481

¿Cómo aprendo dónde está instalado el archivo fuente para un módulo Python dado? ¿Es el método diferente en Windows que en Linux?

Estoy tratando de buscar la fuente del datetimemódulo en particular, pero también estoy interesado en una respuesta más general.

Daryl Spitzer
fuente

Respuestas:

375

Para 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 existe datetime.__file__en Windows) y, por lo tanto, no puede ver la fuente.

Si descarga un tarball fuente de Python y lo extrae, el código de los módulos se puede encontrar en el subdirectorio Módulos .

Por ejemplo, si desea encontrar el código de fecha y hora para Python 2.6, puede mirar

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

Moe
fuente
Si edita su respuesta para indicar que datetime .__ file__ apunta a un .so en Linux y Mac OS X (aunque en Windows el objeto del módulo datetime no tiene atributo de archivo ), aceptaré su respuesta.
Daryl Spitzer el
En realidad, en Windows (al menos en la versión que estoy usando), datetime simplemente no tiene un atributo de archivo .
Daryl Spitzer
221

Ejecutar python -vdesde la línea de comando debería decirle qué se está importando y de 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!

jblocksom
fuente
8
¡Frio! 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 proviene la lib específica.
scorpiodawg
3
¿Dónde están los built-inmódulos?
loretoparisi 05 de
120

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.pathy buscar por ti mismo, etc. (a menos que necesites ser compatible con versiones anteriores más allá de 2.1).

Es el inspectmódulo, en particular, getfileo 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 .pyca .pyarchivos; tratar con archivos .zip, huevos y paquetes de módulos; probando diferentes formas de obtener la ruta a .so/ .pydarchivos 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 .soo , 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.sofoo.cfoomodule.c

abarnert
fuente
3
¿Por qué el __file__no es aplicable para los no incorporados? Entiendo dónde rastrear sys.path puede ser doloroso (especialmente sin saber sobre meta_path), pero ¿le preocupa el espacio de nombres entre __file__definiciones y binarios?
1
Hago esto en 2.7.8 en datetime y solo obtengo un TypeError tanto para getfile como getsourcefile. Personalmente, tengo instaladas varias versiones de Python y necesito saber QUÉ versión de datetimemodule.c está apuntada, porque ahora sé que no apunta a la que debería
apuntarse
1
@mmitchell: si obtiene un TypeError de inspect.getfile (datetime), suponiendo que datetime sea en realidad el módulo y no otra cosa que haya asignado al mismo nombre, estoy bastante seguro de que eso significa que hizo una compilación personalizada para enlaza estáticamente en fecha y hora al intérprete en lugar de convertirlo en un módulo cargable. Pero podría haber otras razones en las que no he pensado. Necesitas hacer una nueva pregunta y dar mucha más información para reproducirla.
abarnert
@mmitchell: Mientras tanto, no hay forma de averiguar a qué versión de datetimemodule.c apunta, porque no apunta a datetimemodule.c, apunta a un módulo compilado creado a partir de ese archivo C; el archivo C puede no existir en su sistema, puede haber sido editado desde que lo compiló, lo que sea.
abarnert
@tristan: No estoy seguro de entender lo que estás preguntando, pero tal vez esto responda: siempre que __file__funciona, inspect.getfilefunciona; no existe una situación en la que adivinar si usar __file__será mejor que simplemente usar el módulo de inspección.
abarnert
67

La sys.pathlista contiene la lista de directorios en los que se buscarán módulos en tiempo de ejecución:

python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]
Greg Hewgill
fuente
10
python -c 'import sys; print "\n".join(sys.path)'le permitirá verlo sin tener que caer en Python interactivo.
Joe Block
66
Python 3:python -c 'import sys; print("\n".join(sys.path))'
arudzinska
61

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

James Mark Mackenzie
fuente
10
(Creo que $modulese entiende como una variable de marcador de posición, no literalmente lo que uno escribiría. Por ejemplo, m=numpy; pip show $m... etc, para cualquiera m)
michael
Esto debe marcarse como la respuesta más precisa para la pregunta formulada.
Rahul Goyal
37

desde la biblioteca estándar intente 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))
Espaciado codificado
fuente
1
Esto es fantástico. Tenía apt-get removeDataDog y aún podía importarlo. Esto me ayudó a encontrar dónde estaban los archivos (para poder eliminarlos) cuando las otras soluciones no ayudaron.
sg
para python3.x, el imppaquete está en desuso (desde la versión 3.4) a favor de importlib(desde 3.1) docs.python.org/3.6/library/imp.html
michael
Ahora necesita usarlo de esta manera para python3. import importlibentoncesimportlib.util.find_spec('fontTools')
Medhat
33

datetime es un módulo integrado, por lo que no hay un archivo fuente (Python).

Para módulos provenientes de .py(o .pyc) archivos, puede usar mymodule.__file__, por ejemplo

> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'
Bjarke Ebert
fuente
12

En el intérprete de Python, puede importar el módulo en particular y luego escribir ayuda (módulo). Esto proporciona detalles como Nombre, Archivo, Documentos del módulo, Descripción y otros.

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

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

Aquí hay una línea para obtener el nombre de archivo de un módulo, adecuado para el alias de shell:

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

Configurar como un alias:

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

Usar:

$ getpmpath twisted
/usr/lib64/python2.6/site-packages/twisted/__init__.pyc
$ getpmpath twisted.web
/usr/lib64/python2.6/site-packages/twisted/web/__init__.pyc
Ernesto
fuente
9

Consulte este ingenioso comando "cdp" para cd al directorio que contiene la fuente del módulo Python indicado:

cdp () {
  cd "$(python -c "import os.path as _, ${1}; \
    print _.dirname(_.realpath(${1}.__file__[:-1]))"
  )"
}
Daryl Spitzer
fuente
¡Gracias! Es justo lo que estaba buscando. Por extraño que parezca, no incluirían algo por el estilo en la distribución de Python.
Antony Hatchkins el
9

En Windows puede encontrar la ubicación del módulo de Python como se muestra a continuación: es decir, encontrar el módulo rest_framework ingrese la descripción de la imagen aquí

Dun0523
fuente
4

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

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

Por supuesto, esta no es una respuesta genérica

nexayq
fuente
0

No todos los módulos de Python están escritos en Python. Datetime resulta ser uno de ellos que no lo es, y (en Linux) es datetime.so.

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

JimB
fuente
2
Daryl: Has confundido la respuesta de Jim, "Datetime es uno de los módulos de python no escritos en python".
Matthew Trevor el
0

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

Alona
fuente
0

Si no está utilizando un intérprete, puede ejecutar el siguiente código:

import site
print (site.getsitepackages())

Salida:

['C:\\Users\\<your username>\\AppData\\Local\\Programs\\Python\\Python37', 'C:\\Users\\<your username>\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages']

El segundo elemento en Array será la ubicación de su paquete. En este caso:

C:\Users\<your username>\AppData\Local\Programs\Python\Python37\lib\site-packages
sudhee
fuente
0

Otra forma de verificar si tiene múltiples versiones de Python instaladas, desde la terminal.

-MBP: ~ python3 -m pip show pyperclip

Ubicación: /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-

MBP: ~ python -m pip show pyperclip

Ubicación: /Users/umeshvuyyuru/Library/Python/2.7/lib/python/site-packages

u_v
fuente
-1

En un IDE como Spyder, importe el módulo y luego ejecútelo individualmente. ingrese la descripción de la imagen aquí

Anirudh Sharma
fuente
Importar e imprimir el str()modelo es una descripción más precisa de lo que está haciendo en la captura de pantalla, además el IDE parece irrelevante para esta solución
mousetail
2
¡Bienvenido a StackOverflow! Por favor no publique código usando imágenes. Las imágenes son difíciles de leer, no se pueden buscar y algunos lectores no pueden verlas. En su lugar, incluya cualquier código relevante directamente en el cuerpo de su respuesta.
Brian