¿Cómo encuentro la ubicación de mi directorio de paquetes de sitios de Python?

¿Cómo puedo encontrar la ubicación de mi directorio de paquetes de sitio?

Hay dos tipos de directorios de paquetes de sitio, globales y por usuario .

  1. Los directorios de sitio-paquetes globales (” dist-packages “) se enumeran en sys.path cuando ejecuta:

     python -m site 

    Para una lista más concisa, ejecute getsitepackages desde el módulo del sitio en el código Python:

     python -c "import site; print(site.getsitepackages())" 

    Nota: Sin embargo, con virtualenvs getsitepackages no está disponible , sys.path de arriba enumerará correctamente el directorio de paquetes de sitio de virtualenv.

  2. El directorio de paquetes de sitio por usuario ( PEP 370 ) es donde Python instala sus paquetes locales:

     python -m site --user-site 

    Si esto apunta a un directorio no existente, verifique el estado de salida de Python y consulte la python -m site --help para obtener explicaciones.

    Sugerencia: la ejecución de la pip list --user o pip freeze --user le da una lista de todos los paquetes de sitio instalados por usuario .


Consejos prácticos

  • .__path__ permite identificar la (s) ubicación (es) de un paquete específico: ( detalles )

     $ python -c "import setuptools as _; print(_.__path__)" ['/usr/lib/python2.7/dist-packages/setuptools'] 
  • .__file__ permite identificar la ubicación de un módulo específico: ( diferencia )

     $ python3 -c "import os as _; print(_.__file__)" /usr/lib/python3.6/os.py 
  • Ejecute pip show para mostrar la información del paquete al estilo de Debian:

     $ pip show pytest Name: pytest Version: 3.8.2 Summary: pytest: simple powerful testing with Python Home-page: https://docs.pytest.org/en/latest/ Author: Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, Floris Bruynooghe, Brianna Laugher, Florian Bruhin and others Author-email: None License: MIT license Location: /home/peter/.local/lib/python3.4/site-packages Requires: more-itertools, atomicwrites, setuptools, attrs, pathlib2, six, py, pluggy 
 >>> import site; site.getsitepackages() ['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages'] 

(o solo el primer elemento con site.getsitepackages()[0] )

Desde la documentación de “Cómo instalar Django” (aunque esto es útil para más que solo la instalación de Django), ejecute lo siguiente desde el shell:

 python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())" 

Formateado para facilitar la lectura (en lugar de usarlo como una sola línea), que se parece a lo siguiente:

 from distutils.sysconfig import get_python_lib print(get_python_lib()) 

Para Ubuntu ,

 python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" 

…no es correcto.

Le dirigirá a /usr/lib/pythonX.X/dist-packages

Esta carpeta solo contiene paquetes que su sistema operativo ha instalado automáticamente para que los progtwigs se ejecuten.

En Ubuntu , la carpeta de paquetes de sitio que contiene paquetes instalados a través de setup_tools \ easy_install \ pip estará en /usr/local/lib/pythonX.X/dist-packages

La segunda carpeta es probablemente la más útil si el caso de uso está relacionado con la instalación o la lectura del código fuente.

Si no usa Ubuntu, probablemente esté seguro al copiar y pegar el primer cuadro de código en el terminal.

Esto es lo que funcionó para mí:

 python -m site --user-site 

Digamos que has instalado el paquete ‘django’. importalo y escribe en dir (django). Le mostrará, todas las funciones y atributos con ese módulo. Escriba el intérprete de python –

 >>> import django >>> dir(django) ['VERSION', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'get_version'] >>> print django.__path__ ['/Library/Python/2.6/site-packages/django'] 

Puedes hacer lo mismo si has instalado mercurial.

Esto es para Snow Leopard. Pero creo que debería funcionar en general también.

Como han señalado otros, distutils.sysconfig tiene la configuración relevante:

 import distutils.sysconfig print distutils.sysconfig.get_python_lib() 

… aunque el sitio predeterminado.py hace algo un poco más crudo, parafraseado a continuación:

 import sys, os print os.sep.join([sys.prefix, 'lib', 'python' + sys.version[:3], 'site-packages']) 

(También agrega ${sys.prefix}/lib/site-python y agrega ambas rutas para sys.exec_prefix también, si esa constante fuera diferente).

Dicho esto, ¿cuál es el contexto? No debes estar jugando con los site-packages tu site-packages directamente; setuptools / distutils funcionará para la instalación, y su progtwig puede ejecutarse en un virtualenv donde Pythonpath es completamente local para el usuario, por lo que tampoco debe asumir el uso de los paquetes del sitio del sistema directamente.

Los paquetes de sistemas nativos instalados con la instalación de python en sistemas basados ​​en Debian se pueden encontrar en:

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

En OSX – /Library/Python/2.7/site-packages

usando este pequeño código:

 from distutils.sysconfig import get_python_lib print get_python_lib() 

Sin embargo, la lista de paquetes instalados a través de pip se puede encontrar en:

/ usr / local / bin /

O simplemente puede escribir el siguiente comando para enumerar todas las rutas donde están los paquetes de Python.

 >>> import site; site.getsitepackages() ['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages'] 

Nota: la ubicación puede variar según el sistema operativo, como en OSX

 >>> import site; site.getsitepackages() ['/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/site-python', '/Library/Python/2.7/site-packages'] 

Todas las respuestas (o: la misma respuesta repetida una y otra vez) son inadecuadas. Lo que quieres hacer es esto:

 from setuptools.command.easy_install import easy_install class easy_install_default(easy_install): """ class easy_install had problems with the fist parameter not being an instance of Distribution, even though it was. This is due to some import-related mess. """ def __init__(self): from distutils.dist import Distribution dist = Distribution() self.distribution = dist self.initialize_options() self._dry_run = None self.verbose = dist.verbose self.force = None self.help = 0 self.finalized = 0 e = easy_install_default() import distutils.errors try: e.finalize_options() except distutils.errors.DistutilsError: pass print e.install_dir 

La línea final le muestra el directorio de instalación. Funciona en Ubuntu, mientras que los anteriores no lo hacen. No me preguntes acerca de Windows u otros dists, pero como es la misma dirección que usa easy_install de forma predeterminada, es probable que sea correcta en todas partes donde funciona easy_install (así que, en todas partes, incluso en macs). Que te diviertas. Nota: el código original tiene muchos enredos.

Una nota al margen: la solución propuesta ( distutils.sysconfig.get_python_lib() ) no funciona cuando hay más de un directorio de paquetes de sitio (como lo recomienda este artículo ). Solo devolverá el directorio principal de paquetes de sitio.

Por desgracia, tampoco tengo mejor solución. Python no parece rastrear los directorios de paquetes de sitios, solo los paquetes que contienen.

Esto funciona para mi Le conseguirá tanto las carpetas dist-paquetes como las carpetas de sitio. Si la carpeta no está en la ruta de Python, no te estará haciendo mucho bien de todos modos.

 import sys; print [f for f in sys.path if f.endswith('packages')] 

Salida (instalación de Ubuntu):

 ['/home/username/.local/lib/python2.7/site-packages', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages'] 

Una nota adicional a la función get_python_lib ya mencionada: en algunas plataformas se usan diferentes directorios para los módulos específicos de la plataforma (por ejemplo, módulos que requieren comstackción). Si pasa plat_specific=True a la función, obtendrá los paquetes del sitio para paquetes específicos de la plataforma.

Esto debería funcionar en todas las distribuciones dentro y fuera del entorno virtual debido a su naturaleza de “baja tecnología”. El módulo os siempre reside en el directorio principal de ‘paquetes de sitio’

 import os; print(os.path.dirname(os.__file__) + '/site-packages') 

Para cambiar dir al directorio de paquetes de sitio, uso el siguiente alias (en sistemas * nix):

 alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages' 
 from distutils.sysconfig import get_python_lib print get_python_lib() 

pip show proporcionará todos los detalles sobre un paquete: https://pip.pypa.io/en/stable/reference/pip_show/ [pip show] [1]

Para obtener la ubicación:

 pip show | grep Location 

Una forma moderna de stdlib es usar el módulo sysconfig , disponible en la versión 2.7 y 3.2+. Python actualmente usa ocho rutas ( docs ):

  • stdlib : directorio que contiene los archivos estándar de la biblioteca de Python que no son específicos de la plataforma.
  • platstdlib : directorio que contiene los archivos estándar de la biblioteca de Python que son específicos de la plataforma.
  • platlib : directorio para archivos específicos del sitio, específicos de la plataforma.
  • purelib : directorio para archivos específicos del sitio, no específicos de la plataforma.
  • include : directorio para archivos de encabezado no específicos de la plataforma.
  • platinclude : directorio para archivos de encabezado específicos de la plataforma.
  • scripts : directorio para archivos de script.
  • datos : directorio para archivos de datos.

En la mayoría de los casos, los usuarios que encuentren esta pregunta estarían interesados ​​en la ruta ‘purelib’ (en algunos casos , también podría estar interesado en ‘platlib’). A diferencia de la respuesta actualmente aceptada, este método no debería comportarse mal dependiendo de si tienes o no un virtualenv activado.

A nivel del sistema (esto es Python 3.7.0 en mac OS):

 >>> import sysconfig >>> sysconfig.get_paths()['purelib'] '/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages' 

Con un venv, obtendrás algo como esto

 >>> import sysconfig >>> sysconfig.get_paths()['purelib'] '/private/tmp/.venv/lib/python3.7/site-packages' 

También está disponible un script de shell para mostrar estos detalles, que puede invocar ejecutando sysconfig como un módulo:

 python -m sysconfig 

Nota: sysconfig ( fuente ) no debe confundirse con el submódulo distutils.sysconfig ( fuente ) mencionado en otras respuestas aquí. Este es un módulo completamente diferente y carece de la función get_paths discutida anteriormente.

Responder a la vieja pregunta. Pero usa ipython para esto.

 pip install ipython ipython import imaplib imaplib? 

Esto dará la siguiente salida sobre el paquete imaplib:

 Type: module String form:  File: /usr/lib/python2.7/imaplib.py Docstring: IMAP4 client. Based on RFC 2060. Public class: IMAP4 Public variable: Debug Public functions: Internaldate2tuple Int2AP ParseFlags Time2Internaldate 

Tenía que hacer algo ligeramente diferente para un proyecto en el que estaba trabajando: busque el directorio relativo de paquetes de sitios en relación con el prefijo de instalación básico. Si la carpeta site-packages estaba en /usr/lib/python2.7/site-packages , quería la parte /lib/python2.7/site-packages . De hecho, me he encontrado con sistemas donde site-packages estaban en /usr/lib64 , y la respuesta aceptada NO funcionó en esos sistemas.

Al igual que la respuesta de tramposo, mi solución se asoma profundamente a las entrañas de Distutils, para encontrar el camino que realmente pasa dentro de setup.py . Fue tan doloroso descubrir que no quiero que nadie tenga que resolver esto de nuevo.

 import sys import os from distutils.command.install import INSTALL_SCHEMES if os.name == 'nt': scheme_key = 'nt' else: scheme_key = 'unix_prefix' print(INSTALL_SCHEMES[scheme_key]['purelib'].replace('$py_version_short', (str.split(sys.version))[0][0:3]).replace('$base', '')) 

Eso debería imprimir algo como /Lib/site-packages o /lib/python3.6/site-packages .

Si ya está agregado a PYTHONPATH , también puedes hacer algo como

 import sys print('\n'.join(sys.path))