Respuestas:
Hay dos tipos de directorios de paquetes de sitio, globales y por usuario .
Los directorios globales de paquetes de sitio (" dist-packages ") se enumeran sys.path
cuando ejecuta:
python -m site
Para obtener una lista más concisa, ejecute getsitepackages
desde el módulo del sitio en código Python:
python -c 'import site; print(site.getsitepackages())'
Nota: Con virtualenvs getsitepackages no está disponible , sin embargo , sys.path
desde arriba se enumerará correctamente el directorio de paquetes de sitio de virtualenv. En Python 3, puede usar el módulo sysconfig en su lugar:
python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])'
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 vea las python -m site --help
explicaciones.
Sugerencia: en ejecución pip list --user
o pip freeze --user
le da una lista de todos los paquetes de sitio instalados por usuario .
<package>.__path__
le permite identificar las ubicaciones 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
Ejecute pip show <package>
para mostrar 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
python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
(también funciona en Python 2 y 3).
python -c "import site; print(site.getsitepackages()[0])"
>>> 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]
)
hasattr(sys,'real_prefix')
y luego determino heurísticamente los paquetes del sitio [p for p in sys.path if p.endswith('site-packages')][-1]
(además de verificar si hay uno encontrado antes de hacer el [-1]
.
Una solución que:
... es esta línea:
python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
Formateado para facilitar la lectura (en lugar de utilizarlo como una sola línea), tiene el siguiente aspecto:
from distutils.sysconfig import get_python_lib
print(get_python_lib())
Fuente: una versión muy antigua de "Cómo instalar Django" (aunque esto es útil para algo más que la instalación de Django)
cdsitepackages
, para cambiar directamente al directorio de paquetes de sitio del entorno.
/usr/lib/python3/dist-packages
lugar de /usr/lib/python3.5/dist-packages
.
Para Ubuntu ,
python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
...no es correcto.
Te señalará a /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 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 copiando y pegando el primer cuadro de código en la terminal.
module.__file__
es la mejor manera. Si intentan instalar cosas ... solo use las herramientas.
'/usr/lib/pythonX.X/dist-packages' in site.getsitepackages()
en Ubuntu (aunque va después /usr/local/...
en la lista). Solo obtiene algo en /usr/local
via sudo pip
y no debe usarlo sudo pip
en Ubuntu a menos que haya decidido hacer su propia distribución: si lo usa sudo pip
, es su responsabilidad asegurarse de que todas las dependencias de los módulos actuales y futuros de python instalados a través de sudo apt
o sudo pip
sean compatibles. Considere qué problema virtualenv
se creó para resolver
dist-packages
en (L) Ubuntu.
Esto es lo que funcionó para mí:
python -m site --user-site
~/.local/lib/python2.7/site-packages
).
virtualenv
se queja de que el paquete no existe. ¿Cómo invoco los paquetes instalados en una ubicación personalizada?
Digamos que ha instalado el paquete 'django'. impórtelo y escriba 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']
Puede hacer lo mismo si ha instalado mercurial.
Esto es para Snow Leopard. Pero creo que también debería funcionar en general.
django.__file__
para esto en lugar de __path__
. y, no, no es una garantía de que esto tenga algo que ver con los paquetes del sitio, pero con cosas como django, que probablemente hayas instalado pip , lo hará cuando tengas prisa y puede usarse para otros propósitos también (leer un archivo de configuración predeterminado del sistema de archivos, por ejemplo).
foo.bar
paquete:python -c "import foo.bar as _; print(_.__path__[0])"
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 ambas rutas sys.exec_prefix
también, en caso de que esa constante sea 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 virtualenv donde su pythonpath es completamente local para el usuario, por lo que tampoco debe asumir el uso de los paquetes del sitio del sistema directamente.
python2
osx y ubuntu con y sin virtualenv pero no con python3
nada.
python3
.
Una forma moderna de stdlib está utilizando el sysconfig
módulo, disponible en la versión 2.7 y 3.2+.
Nota : sysconfig
( fuente ) no debe confundirse con el distutils.sysconfig
submódulo ( fuente ) mencionado en varias otras respuestas aquí. Este último es un módulo completamente diferente y carece de la get_paths
función que se describe a continuación.
Python actualmente usa ocho rutas ( docs ):
- stdlib : 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.
- 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.
- data : 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 actual aceptada, este método aún funciona independientemente de si tiene 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
platlib
, como por ejemplo /usr/local/lib/python3.6/site-packages
? Tradicionalmente, las cosas instaladas localmente deberían entrar /usr/local
.
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-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 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']
site.getsitepackages()
desde la instalación del sistema, por lo tanto, los paquetes dist, otras instalaciones mostrarán paquetes de sitio.
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 muestra el directorio de instalación. Funciona en Ubuntu, mientras que los anteriores no. No me pregunte acerca de Windows u otros discos, pero dado que es exactamente el mismo directorio que usa easy_install por defecto, probablemente sea correcto en todas partes donde funciona easy_install (por lo tanto, en todas partes, incluso en Mac). Que te diviertas. Nota: el código original tiene muchas palabrotas.
easy_install
y no falla correctamente si no está disponible, lo cual es inadecuado :)
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 se recomienda en este artículo ). Solo devolverá el directorio principal de paquetes de sitio.
Por desgracia, tampoco tengo una solución mejor. Python no parece hacer un seguimiento de los directorios de paquetes de sitio, solo los paquetes dentro de ellos.
get_python_lib()
cuando se ejecuta desde virtualenv muestra los paquetes de sitio de Python utilizados para crear virtualenv y no los paquetes de sitio de virtualenv .
Esto funciona para mi. Obtendrá las carpetas dist-packages y site-packages. Si la carpeta no está en la ruta 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']
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 padre de 'site-packages'
import os; print(os.path.dirname(os.__file__) + '/site-packages')
Para cambiar el directorio al directorio de paquetes del sitio, uso el siguiente alias (en los sistemas * nix):
alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'
Una nota adicional a la get_python_lib
función mencionada anteriormente: en algunas plataformas se utilizan diferentes directorios para módulos específicos de la plataforma (por ejemplo: módulos que requieren compilación). Si pasa plat_specific=True
a la función, obtiene los paquetes del sitio para paquetes específicos de la plataforma.
from distutils.sysconfig import get_python_lib
print get_python_lib()
pip show dará 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 <package_name>| grep Location
Responde a la vieja pregunta. Pero use 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
Tenía que hacer algo un poco diferente para un proyecto que estaba trabajando: encontrar la relación site-packages directorio relativo a la base instalada de prefijo. Si la carpeta de paquetes del sitio estaba en /usr/lib/python2.7/site-packages
, quería la /lib/python2.7/site-packages
parte. De hecho, he encontrado sistemas donde site-packages
estaba /usr/lib64
, y la respuesta aceptada NO funcionó en esos sistemas.
Similar a la respuesta del tramposo, mi solución se asoma profundamente en las entrañas de Distutils, para encontrar el camino que realmente se transmite por dentro setup.py
. Fue tan doloroso descubrir que no quiero que nadie tenga que resolver esto nuevamente.
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
.
pip show <package name>