¿Cómo encuentro la ubicación de mi directorio de paquetes de sitio de Python?
-
02-07-2019 - |
Pregunta
¿Cómo encuentro la ubicación de mi directorio de paquetes de sitio?
Solución
Hay dos tipos de directorios de paquetes de sitios, global y por usuario.
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.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
opip 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))