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

StackOverflow https://stackoverflow.com/questions/122327

  •  02-07-2019
  •  | 
  •  

Pregunta

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

¿Fue útil?

Solución

Hay dos tipos de directorios de paquetes de sitios, global y por usuario.

  1. Global paquetes de sitio ("paquetes-dist") los directorios se enumeran en sys.path cuando corres:

    python -m site
    

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

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

    Nota: Con entornos virtuales getsitepackages no está disponible, sys.path Sin embargo, desde arriba enumerará correctamente el directorio de paquetes de sitio de virtualenv.

  2. El por usuario directorio de paquetes de sitio (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 vea python -m site --help para explicaciones.

    Pista: Correr pip list --user o pip freeze --user te da una lista de todos los instalados por usuario paquetes de sitio.


Consejos prácticos

  • <package>.__path__ le 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']
    
  • <module>.__file__ le 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
    
  • Correr pip show <package> para mostrar información del paquete estilo 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
    

Otros consejos

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

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

De Documentación "Cómo instalar Django" (aunque esto es útil para algo más que 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), 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.

Te señalará /usr/lib/pythonX.X/dist-packages

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

en ubuntu, la carpeta de paquetes del sitio que contiene los paquetes instalados mediante 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 copiando y pegando el primer cuadro de código en la terminal.

Esto es lo que funcionó para mí:

python -m site --user-site

Digamos que ha instalado el paquete 'django'.impórtalo y escribe dir(django).Le mostrará todas las funciones y atributos de 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 tienes instalado Mercurial.

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

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

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

... aunque el valor predeterminado site.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 ambos caminos para sys.exec_prefix también, si esa constante fuera diferente).

Dicho esto, ¿cuál es el contexto?No deberías estar jugando con tu site-packages directamente;setuptools/distutils funcionará para la instalación, y su programa puede estar ejecutándose en un entorno virtual donde su ruta de Python es completamente local para el usuario, por lo que tampoco debería asumir el uso de los paquetes del sitio del sistema directamente.

Los paquetes del sistema nativo instalados con la instalación de Python en sistemas basados ​​en Debian se pueden encontrar en:

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

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 se puede escribir el siguiente comando para enumerar todas las rutas donde se encuentran 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 su 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 última línea le muestra el directorio de instalación.Funciona en Ubuntu, mientras que los anteriores no.No me preguntes sobre Windows u otras distribuciones, pero dado que es exactamente el mismo directorio que easy_install usa de forma predeterminada, probablemente sea correcto en todos los lugares donde funciona easy_install (es decir, en todas partes, incluso en Mac).Divertirse.Nota:El código original tiene muchas malas palabras.

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 recomendado por este artículo).Solo devolverá el directorio principal de paquetes del sitio.

Por desgracia, tampoco tengo una solución mejor.Python no parece realizar un seguimiento de los directorios de paquetes del sitio, solo de los paquetes que contienen.

Esto funciona para mí.Obtendrá las carpetas dist-packages y site-packages.Si la carpeta no está en el camino de Python, de todos modos no te hará mucho bien.

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 get_python_lib función mencionada ya:en algunas plataformas se utilizan diferentes directorios para módulos específicos de la plataforma (por ejemplo:módulos que requieren compilación).si pasas plat_specific=True a la función obtienes 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 del sistema operativo siempre reside en el directorio principal de 'paquetes de sitio'

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

Para cambiar el directorio 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()

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

  • biblioteca estándar:Directorio que contiene los archivos de la biblioteca estándar de Python que no son específicos de la plataforma.
  • platstdlib:Directorio que contiene los archivos de la biblioteca estándar de Python que son específicos de la plataforma.
  • plataforma:directorio para archivos específicos del sitio y de la plataforma.
  • puralib:directorio para archivos específicos del sitio y no específicos de la plataforma.
  • incluir:directorio para archivos de encabezado no específicos de la plataforma.
  • platino incluye:directorio para archivos de encabezado específicos de la plataforma.
  • guiones: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, es posible que también te interese 'platlib').A diferencia de la respuesta actualmente aceptada, este método no debería funcionar mal dependiendo de si tiene activado o no un virtualenv.

A nivel de 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 módulo:

python -m sysconfig

Nota: sysconfig (fuente) no debe confundirse con el distutils.sysconfig submódulo (fuente) mencionado en varias otras respuestas aquí.Ese es un módulo completamente diferente y le falta la get_paths función comentada anteriormente.

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

Para obtener la ubicación:

pip show <package_name>| grep Location

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

pip install ipython
ipython 
import imaplib
imaplib?

Esto dará el siguiente resultado sobre el paquete imaplib:

Type:        module
String form: <module 'imaplib' from '/usr/lib/python2.7/imaplib.py'>
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

Tuve que hacer algo ligeramente diferente para un proyecto en el que estaba trabajando:encuentra el relativo directorio de paquetes de sitio relativo al prefijo de instalación base.Si la carpeta de paquetes del sitio estaba en /usr/lib/python2.7/site-packages, quería el /lib/python2.7/site-packages parte.De hecho, me he encontrado con sistemas en los que site-packages estaba en /usr/lib64, y la respuesta aceptada NO funcionó en esos sistemas.

De manera similar a la respuesta del tramposo, mi solución se asoma profundamente en las entrañas de Distutils, para encontrar el camino que realmente pasa por dentro. setup.py.Fue tan doloroso darme cuenta de que no quiero que nadie tenga que darse cuenta de esto otra vez.

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.

Deberías probar este comando para determinar la ubicación de instalación de pip.

Pitón 2

pip show six | grep "Location:" | cut -d " " -f2

Pitón 3

pip3 show six | grep "Location:" | cut -d " " -f2

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

import sys
print('\n'.join(sys.path))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top