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

1142

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

1
  • 90
    Si solo desea la ubicación exacta de un paquete, puede usarpip show <package name>joshuakcockrell 25 de julio de 2017 a las 5:18
768

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

  1. Los directorios globales de paquetes de sitios (" 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 mostrará correctamente el directorio de paquetes de sitios 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 que no existe, verifique el estado de salida de Python y vea las python -m site --helpexplicaciones.

    Sugerencia: Ejecutando 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 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
    
  • Ejecutar pip show <package>para mostrar la información del paquete al 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
    
6
  • 20
    hay un directorio de paquetes 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 13 de septiembre de 2017 a las 14:15
  • 4
    Bonito. Y para conseguir el primero:python -c "import site; print(site.getsitepackages()[0])"Brent Faust 4 de mayo de 2018 a las 18:25
  • 2
    Esto debería estar en cualquier tutorial básico sobre el uso de Python. He estado usando Python durante años y no sabía nada sobre el módulo del sitio. Hubiera ahorrado tantos dolores de cabeza ...salotz 18 oct 2019 a las 16:30
  • 1
    He sugerido un cambio en el tutorial oficial de Python. Consulte PR # 16974 para obtener más detalles, y gracias por la sugerencia @salotz. Peterino 6/11/19 a las 14:27
  • 2
    Creo que stackoverflow.com/a/52638888/1365918 es fácilmente la mejor respuesta a esta pregunta. kapad 11 feb.20 a las 10:06
676
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

(o solo el primer artículo con site.getsitepackages()[0])

10
  • 17
    Esto es bueno pero, desafortunadamente, esta función solo está disponible en python2.7. Entonces, buena solución si está usando python2.7 o superior, pero no funciona para python 2.6 y versiones inferioresDan Niero 20/01/2013 a las 19:58
  • 15
    python -c "importar sitio; imprimir (sitio.getsitepackages ())"Lars Schneider 10 dic '13 a las 14:00
  • 29
    Obtengo AttributeError: el objeto 'module' no tiene el atributo 'getsitepackages' cuando se usa con virtualenv (python 2.7.8), aunque la solución distutils a continuación funciona. radtek 5 de agosto de 2014 a las 14:58
  • 8
    @radtek: para venv, detecto venv a través hasattr(sys,'real_prefix')y luego determino los paquetes del sitio de forma heurística [p for p in sys.path if p.endswith('site-packages')][-1](además , verifico si se encuentra uno antes de hacer el [-1].eudoxos 15 de agosto de 2014 a las 6:10
  • 4
    @radtek Es un error conocido que el módulo del sitio no funciona para virtualenv github.com/pypa/virtualenv/issues/355Guillem Cucurull 6/07/2016 a las 13:18
337

Una solución que:

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

... es esta una sola línea:

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


Fuente: una versión muy antigua de la documentación "Cómo instalar Django" (aunque esto es útil para algo más que la instalación de Django)

6
  • 1
    ¿Virtualenv proporciona una forma de encontrar sus paquetes de sitios? Daryl Spitzer 13/11/11 a las 14:57
  • 10
    Puede usar virtualenvwrapper, que tiene el comando cdsitepackages, para cambiar directamente al directorio de paquetes del sitio del entorno. john2x 10/02/12 a las 10:06
  • 6
    @PiotrDobrogost: funciona para mí en Python 2.7 en un virtualenv en LinuxRichVel 6 de marzo de 2013 a las 9:57
  • 2
    El primer comentario ya no se aplica: esto mostró la ubicación correcta tanto dentro como fuera de un virtualenv. astrojuanlu 15/04/2016 a las 10:21
  • 3
    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 15 de septiembre de 2017 a las 8:57
101

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 los programas se ejecuten.

En ubuntu , la carpeta site-packages 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 sea seguro copiar y pegar el primer cuadro de código en la terminal.

3
  • 3
    Si el autor de la pregunta busca la ubicación de un paquete en particular, module.__file__es la mejor manera. Si están intentando instalar cosas ... simplemente use las herramientas. Tobu 30/11/12 a las 15:37
  • 1
    '/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 decida hacer su propia distribución: si lo usa sudo pip, es su responsabilidad asegurarse de que todas las dependencias de los módulos de Python actuales y futuros instalados a través de sudo apto sudo pipsean compatibles. Considere qué problema virtualenvse creó para resolverjfs 13 de septiembre de 2017 a las 14:54
  • Explicación clara para entender las diferencias del 2 dist-packagesen (L) Ubuntu. Timo 28/11/2017 a las 12:39
71

Esto es lo que funcionó para mí:

python -m site --user-site
7
  • dieciséis
    Para mí, esto apunta a una carpeta que ni siquiera existe ( ~/.local/lib/python2.7/site-packages). Neil Traft 11/07/2014 a las 18:45
  • 1
    Lo mismo, en OS X Mavericks, mi .local de casa no es lo que quería que encontrara y sí, no está realmente allí de todos modos. radtek 11/08/2014 a las 19:54
  • Está en mi carpeta principal / Biblioteca, tuve que navegar manualmente hacia ella, por alguna razón, la ruta completa directa no funcionabaericjam 18 de septiembre de 2015 a las 15:39
  • ¿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 25/04/2016 a las 21:45
  • 3
    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. Honest Abe 31/03/2017 a las 19:10
32

Digamos que ha instalado el paquete 'django'. importarlo y escribir dir (django). Te 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.

4
  • >>> 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 4 mar 13 a las 22:09
  • funciona, necesito encontrar el paquete sklearn para agregar a la ruta PYDEV, gracias. berkay 2/01/15 a las 21:20
  • 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 , funcionará cuando tengas prisa y se puede usar para también para otros propósitos (leer un archivo de configuración predeterminado del sistema de archivos, por ejemplo). JL Peyret 15 de marzo de 2019 a las 23:31
  • Según esta y otras respuestas, puede hacer esto en una línea desde la línea de comando para obtener la ruta a su foo.barpaquete:python -c "import foo.bar as _; print(_.__path__[0])"snark 12/12/19 a las 10:29
31

Una forma moderna de stdlib es usar el sysconfigmódulo, disponible en la versión 2.7 y 3.2+. A diferencia de la respuesta aceptada actual, este método aún funciona independientemente de si tiene o no un entorno virtual activo.

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 ( documentos ):

  • stdlib: directory containing the standard Python library files that are not platform-specific.
  • platstdlib: directory containing the standard Python library files that are platform-specific.
  • platlib: directory for site-specific, platform-specific files.
  • purelib: directory for site-specific, non-platform-specific files.
  • include: directory for non-platform-specific header files.
  • platinclude: directory for platform-specific header files.
  • scripts: directory for script files.
  • data: directory for data files.

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 a usted también le interese 'platlib'). La ruta purelib es donde los paquetes normales de Python serán instalados por herramientas como pip.

A nivel del sistema, verá algo como esto:

# Linux
$ python3 -c "import sysconfig; print(sysconfig.get_path('purelib'))"
/usr/local/lib/python3.8/site-packages

# macOS (brew installed python3.8)
$ python3 -c "import sysconfig; print(sysconfig.get_path('purelib'))"
/usr/local/Cellar/[email protected]/3.8.3/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages

# Windows
C:\> py -c "import sysconfig; print(sysconfig.get_path('purelib'))"
C:\Users\wim\AppData\Local\Programs\Python\Python38\Lib\site-packages

Con un venv, obtendrás algo como esto

# Linux
/tmp/.venv/lib/python3.8/site-packages

# macOS
/private/tmp/.venv/lib/python3.8/site-packages

# Windows
C:\Users\wim\AppData\Local\Temp\.venv\Lib\site-packages

La función sysconfig.get_paths()devuelve un dictado de todas las rutas de instalación relevantes, ejemplo en Linux:

>>> import sysconfig
>>> sysconfig.get_paths()
{'stdlib': '/usr/local/lib/python3.8',
 'platstdlib': '/usr/local/lib/python3.8',
 'purelib': '/usr/local/lib/python3.8/site-packages',
 'platlib': '/usr/local/lib/python3.8/site-packages',
 'include': '/usr/local/include/python3.8',
 'platinclude': '/usr/local/include/python3.8',
 'scripts': '/usr/local/bin',
 'data': '/usr/local'}

También hay disponible un script de shell para mostrar estos detalles, que puede invocar ejecutándolo sysconfigcomo un módulo:

python -m sysconfig
2
  • Esta es una gran respuesta, estoy feliz de que el nuevo módulo sysconfig lo haga más fácil. ¿Hay alguna forma 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 7 dic 2019 a las 10:18
  • ¡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 / se almacena en caché cuando se carga Python? Sabiendo eso también sería útil en mi opinión. kapad 11 feb.20 a las 10:05
24

Como han señalado otros, distutils.sysconfigtiene las configuraciones relevantes:

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_prefix, si esa constante es diferente).

Dicho eso, ¿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.

3
  • 3
    funciona de manera confiable con python2en osx y ubuntu con y sin virtualenv pero no con python3en absoluto. jitter 18 de mayo de 2016 a las 18:34
  • 2
    2008 fue hace un tiempo: esta respuesta fue tres meses antes del lanzamiento de Python 3.0. Charles Duffy 18 de mayo de 2016 a las 18:37
  • seguro, 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 18 de mayo de 2016 a las 18:40
23

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 mediante pipse puede encontrar en:

/usr/local/bin/

O simplemente 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']
2
  • Si mal no recuerdo, dist-packages es específico de Debian y sus derivados. Samuel 21/07/2017 a las 21:11
  • 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 del sitio. fnatic_shank 23/03/18 a las 5:31
14

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 pregunte acerca de Windows u otros dists, 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 macs). Divertirse. Nota: el código original tiene muchas palabrotas.

3
  • 1
    Gracias, esto es bastante útil, en py3 con corchetes para imprimir me obtiene /usr/local/lib/python3.4/dist-packages Estoy tratando de averiguar cómo obtener /usr/lib/python3.4/dist -Paquetes por lo que tendrá que jugar más. Stuart Axon 2 de diciembre de 2015 a las 5:29
  • 6
    requiere una biblioteca externa easy_instally no falla correctamente si no está disponible, lo cual es inadecuado :)jitter 18 de mayo de 2016 a las 18:36
  • 1
    de hecho, esto no es perfecto, pero funcionó para mí y me tomó mucho tiempo resolverlo, así que lo puse aquí con la esperanza de que alguien más pueda aprovechar el tiempo que ya he dedicado. cheater 25 de mayo de 2016 a las 15:05
14

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 sitios (como recomienda 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 de sitios, solo los paquetes que contienen.

3
  • 1
    Supongo que esa es la razón por la que get_python_lib()cuando se ejecuta desde virtualenv se muestran los paquetes de sitio de Python utilizados para crear virtualenv y no los paquetes de sitio de virtualenv . Piotr Dobrogost 12/11/11 a las 19:04
  • 3
    @Piotr Probablemente fue un error en distutils.sysconfig. Lo acabo de probar y obtengo los paquetes internos del sitio, como se esperaba. Tobu 30/11/12 a las 12:37
  • También probado 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 6 de marzo de 2013 a las 9:56
14

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

En Linux, puede ir a la carpeta de paquetes del sitio de la siguiente manera:

cd $(python -c "import site; print(site.getsitepackages()[0])")
2
13

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 le servirá de mucho.

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']
2
  • 2
    La respuesta aceptada es la forma recomendada, por lo que debe decir por qué la suya es mejor, ya que es un trucoCharlesB 30/03/12 a las 16:37
  • ¿Qué pasa con un truco? ;) Es más simple y fácil de entender y recordar si trabaja de forma interactiva. just_an_old_guy 31/03/12 a las 0:05
13

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 dir al directorio de paquetes de sitio, utilizo el siguiente alias (en sistemas * nix):

alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'
2
  • Me gusta tu enfoque de baja tecnología. Aquí hay una versión independiente de la plataforma: import os; print (os.path.join (os.path.dirname (os .__ file__), 'site-packages'))DougR 4 dic.20 a las 11:22
  • 1
    mi código original también es independiente de la plataforma. Windows acepta barras diagonales ('/') y barras diagonales inversas (``) como separadores de ruta. Es más común en Windows usar las barras diagonales inversas. Pyramid Newbie 14 de marzo a las 20:45
11

Una nota adicional a la get_python_libfunción ya mencionada: 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.

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

Debería 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
4

Respuesta a 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
1
  • 1
    Este no es el directorio de paquetes de sitio, sino el directorio en el que está instalado el paquete. Esto también es útil solo si está utilizando iPython y no para poder obtener un directorio de instalación mediante programación. Daniel Underwood 10 de diciembre de 2016 a las 23:14
2

Para aquellos que usan poesía , pueden encontrar la ruta de su entorno virtual con poetry debug:

$ poetry debug

Poetry
Version: 1.1.4
Python:  3.8.2

Virtualenv
Python:         3.8.2
Implementation: CPython
Path:           /Users/cglacet/.pyenv/versions/3.8.2/envs/my-virtualenv
Valid:          True

System
Platform: darwin
OS:       posix
Python:   /Users/cglacet/.pyenv/versions/3.8.2

Con esta información, puede enumerar los paquetes del sitio:

ls /Users/cglacet/.pyenv/versions/3.8.2/envs/my-virtualenv/lib/python3.8/site-packages/
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 site-packages estaba dentro /usr/lib/python2.7/site-packages, quería la /lib/python2.7/site-packagespieza. De hecho, he encontrado sistemas en los que 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 pasa por dentro setup.py. Fue un dolor darme cuenta de que no quiero que nadie tenga que volver a darse cuenta de esto.

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.

1

Hice una función realmente simple que hace el trabajo

import site


def get_site_packages_dir():
        return [p for p  in site.getsitepackages()
                if "site-packages" in p][0]

get_site_packages_dir()
# '/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages'

Si desea recuperar los resultados usando la terminal:

python3 -c "import site;print([p for p in site.getsitepackages() if 'site-package' in p][0])"

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages


0

Algo que no se ha mencionado y que creo que es útil, si tiene dos versiones de Python instaladas, por ejemplo, la 3.8 y la 3.5, puede haber dos carpetas llamadas paquetes de sitio en su máquina. En ese caso, puede especificar la versión de Python usando lo siguiente:

py -3.5 -c "import site; print(site.getsitepackages()[1])