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

943

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

Daryl Spitzer
fuente
63
Si solo desea la ubicación exacta de un paquete, puede usarlopip show <package name>
joshuakcockrell el

Respuestas:

534

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

  1. Los directorios globales de paquetes de sitio (" dist-packages ") se enumeran sys.pathcuando ejecuta:

    python -m site

    Para obtener una lista más concisa, ejecute getsitepackagesdesde 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.pathdesde 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"])'
  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 vea las python -m site --helpexplicaciones.

    Sugerencia: en ejecución pip list --usero pip freeze --userle da una lista de todos los paquetes de sitio instalados por usuario .


Consejos prácticos

  • <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
Peterino
fuente
17
hay un directorio de paquete de sitio en un virtualenv. Puede obtener el directorio para módulos específicos del sitio dentro / fuera de virtualenv usando python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"(también funciona en Python 2 y 3).
jfs
44
Agradable. Y para obtener el primero:python -c "import site; print(site.getsitepackages()[0])"
Brent Faust
2
Esto debería estar en cualquier tutorial básico sobre el uso de python. He estado haciendo pitones durante años y no sabía sobre el módulo del sitio.
Hubiera
1
He sugerido un cambio al tutorial oficial de Python. Por favor, consulte PR # 16974 para más detalles, y gracias por la sugerencia @salotz!
Peterino
1
Creo que stackoverflow.com/a/52638888/1365918 es fácilmente la mejor respuesta a esta pregunta.
kapad
652
>>> 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])

eudoxos
fuente
17
Esto es bueno pero, desafortunadamente, esta función solo está disponible desde python2.7. Entonces, una buena solución si está utilizando python2.7 o superior, pero no funciona para python 2.6 y
versiones
15
python -c "sitio de importación; print (site.getsitepackages ())"
Lars Schneider
29
Obtengo AttributeError: el objeto 'módulo' no tiene el atributo 'getsitepackages' cuando se usa con virtualenv (python 2.7.8), aunque la solución distutils a continuación funciona.
radtek
8
@radtek: para venv, detecto venv a través de 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].
eudoxos
44
@radtek Es un error conocido que el módulo del sitio no funciona para virtualenv github.com/pypa/virtualenv/issues/355
Guillem Cucurull
319

Una solución que:

  • fuera de virtualenv: proporciona la ruta de los paquetes de sitio globales ,
  • Insidue a virtualenv: proporciona los paquetes de sitio de virtualenv

... 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)

Daryl Spitzer
fuente
1
¿Virtualenv proporciona una manera de encontrar sus paquetes de sitio?
Daryl Spitzer
10
Puede usar virtualenvwrapper, que tiene el comando cdsitepackages, para cambiar directamente al directorio de paquetes de sitio del entorno.
juan2x
66
@PiotrDobrogost: funciona para mí en Python 2.7 en un virtualenv en Linux
RichVel
2
El primer comentario ya no se aplica: esto mostró la ubicación correcta tanto fuera como dentro de un virtualenv.
astrojuanlu
2
No funcionó para mí en Windows 10 usando Linux bash, regresa en /usr/lib/python3/dist-packageslugar de /usr/lib/python3.5/dist-packages.
Delgan
99

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.

David Hollander
fuente
3
Si el autor de la pregunta busca la ubicación de un paquete en particular, module.__file__es la mejor manera. Si intentan instalar cosas ... solo use las herramientas.
Tobu
'/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/localvia sudo pipy no debe usarlo sudo pipen 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 apto sudo pipsean compatibles. Considere qué problema virtualenvse creó para resolver
jfs
Explicación clara para comprender las diferencias de los 2 dist-packagesen (L) Ubuntu.
Timo
69

Esto es lo que funcionó para mí:

python -m site --user-site
Ramashri
fuente
15
Para mí, esto apunta a una carpeta que ni siquiera existe ( ~/.local/lib/python2.7/site-packages).
Neil Traft
1
mismo, en OS X Mavericks, mi hogar .local no es lo que quería que encontrara y sí, de todos modos no está realmente allí.
radtek
Está en mi principal / Biblioteca carpeta que tenía que manualmente navegar hacia él, por alguna razón la ruta completa directa no estaba funcionando
efwjames
¿Cómo uso los paquetes instalados aquí? Si lo hago, virtualenvse queja de que el paquete no existe. ¿Cómo invoco los paquetes instalados en una ubicación personalizada?
AbtPst
2
Esto le indica dónde buscará Python los paquetes específicos del usuario. Comentarios como "ni siquiera existe" y "no es lo que quería que encontrara" no tienen sentido en este contexto.
Honesto Abe
28

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.

Sumod
fuente
>>> import pg >>> print pg .__ path__ Traceback (última llamada más reciente): Archivo "<stdin>", línea 1, en <module> AttributeError: el objeto 'módulo' no tiene atributo ' ruta '
Dannid
funciona, necesito encontrar el paquete sklearn para agregar a la ruta PYDEV, gracias.
berkay
utilizar 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).
JL Peyret
Sobre la base de esta y otras respuestas que usted puede hacer esto en una línea desde la línea de comandos para obtener la ruta a su foo.barpaquete:python -c "import foo.bar as _; print(_.__path__[0])"
snark
23

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

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

... aunque el valor predeterminado site.pyhace 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-pythony agrega ambas rutas sys.exec_prefixtambién, en caso de que esa constante sea diferente).

Dicho esto, ¿cuál es el contexto? No deberías estar jugando con tu site-packagesdirectamente; 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.

Charles Duffy
fuente
3
funciona de manera confiable con python2osx y ubuntu con y sin virtualenv pero no con python3nada.
jitter
2
2008 fue hace un tiempo: esta respuesta fue tres meses antes del lanzamiento de Python 3.0.
Charles Duffy
claro, pero hoy mi comentario podría ayudar. corrígeme si me equivoco. Además, no rechacé esta respuesta ni ninguna otra con respecto a python3.
jitter
22

Una forma moderna de stdlib está utilizando el sysconfigmódulo, disponible en la versión 2.7 y 3.2+.

Nota : sysconfig( fuente ) no debe confundirse con el distutils.sysconfigsubmódulo ( fuente ) mencionado en varias otras respuestas aquí. Este último es un módulo completamente diferente y carece de la get_pathsfunció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 sysconfigcomo un módulo:

python -m sysconfig
wim
fuente
Esta es una gran respuesta, estoy feliz de que el nuevo módulo sysconfig lo haga más fácil. ¿Hay alguna manera de obtener el prefijo local platlib, como por ejemplo /usr/local/lib/python3.6/site-packages? Tradicionalmente, las cosas instaladas localmente deberían entrar /usr/local.
eudoxos
¡Fácilmente la mejor respuesta a esta pregunta! Gracias. Lo único que encontré que faltaba fue el orden en el que se verifican estas ubicaciones cuando se encuentra una declaración de importación. Además, ¿alguna de estas ubicaciones se busca previamente / almacena en caché cuando se carga Python? Sabiendo que también sería útil IMO.
kapad
21

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 pipse 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']
fnatic_shank
fuente
Si no recuerdo mal, dist-packages es específico de Debian y sus derivados.
Samuel
1
@SamuelSantana tienes razón. Los paquetes dist son específicos de los sistemas basados ​​en Debian. En este caso, invoqué site.getsitepackages()desde la instalación del sistema, por lo tanto, los paquetes dist, otras instalaciones mostrarán paquetes de sitio.
fnatic_shank el
15

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.

tramposo
fuente
1
Gracias, esto es bastante útil, en py3 con corchetes para imprimir me da /usr/local/lib/python3.4/dist-packages Estoy tratando de averiguar cómo obtener /usr/lib/python3.4/dist -paquetes así que tendremos que jugar más.
Stuart Axon
44
requiere una biblioteca externa easy_instally no falla correctamente si no está disponible, lo cual es inadecuado :)
jitter
1
de hecho, esto no es perfecto, pero funcionó para mí y me llevó mucho tiempo resolverlo, así que lo puse aquí con la esperanza de que alguien más pueda aprovechar el tiempo que ya he dedicado.
tramposo
13

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.

Vladimir Vagaytsev
fuente
1
Supongo que esa es la razón por la cual 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 .
Piotr Dobrogost
3
@Piotr Eso fue probablemente un error en distutils.sysconfig. Acabo de probarlo y obtengo los paquetes de sitio internos, como se esperaba.
Tobu
También se probó con Python 2.7 instalado en un virtualenv en Linux, y el método distutils.sysconfig funciona bien para obtener los paquetes de sitio internos de Python.
RichVel
12

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']
just_an_old_guy
fuente
2
respuesta aceptada es la forma recomendada, por lo que debe decir por qué la suya es mejor, ya que es un poco de un truco
charlesb
¿Qué tiene de malo un hack? ;) Es más simple y fácil de entender y recordar si está trabajando interactivamente.
just_an_old_guy
11

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'
Pyramid Newbie
fuente
10

Una nota adicional a la get_python_libfunció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=Truea la función, obtiene los paquetes del sitio para paquetes específicos de la plataforma.

Armin Ronacher
fuente
8
from distutils.sysconfig import get_python_lib
print get_python_lib()
Florian Bösch
fuente
3

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
Sahil Agarwal
fuente
1
Este no es el directorio de paquetes del sitio, sino el directorio en el que está instalado el paquete. Esto también es útil si está usando iPython y no para poder obtener mediante programación un directorio de instalación.
danielunderwood
3

Debe probar este comando para determinar la ubicación de instalación de pip

Python 2

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

Python 3

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

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-packagesparte. De hecho, he encontrado sistemas donde site-packagesestaba /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-packageso /lib/python3.6/site-packages.

MultipleMonomials
fuente
-2

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

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