Comment trouver l'emplacement de mon répertoire de packages de site Python?

943

Comment trouver l'emplacement de mon répertoire de sites-packages?

Daryl Spitzer
la source
63
Si vous voulez juste l'emplacement exact d'un paquet, vous pouvez utiliserpip show <package name>
joshuakcockrell

Réponses:

534

Il existe deux types de répertoires de packages de site, globaux et par utilisateur .

  1. Les répertoires globaux des packages de site (" dist-packages ") sont répertoriés sys.pathlorsque vous exécutez:

    python -m site

    Pour une liste plus concise exécutée à getsitepackagespartir du module de site en code Python:

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

    Remarque: Avec virtualenvs getsitepackages n'est pas disponible , sys.pathci-dessus listera correctement le répertoire des packages de site de virtualenv. En Python 3, vous pouvez utiliser le module sysconfig à la place:

    python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])'
  2. Le répertoire des packages de site par utilisateur ( PEP 370 ) est l'endroit où Python installe vos packages locaux:

    python -m site --user-site

    Si cela pointe vers un répertoire inexistant, vérifiez l'état de sortie de Python et voyez python -m site --helppour des explications.

    Astuce: en cours d'exécution pip list --userou pip freeze --uservous donne une liste de tous les packages de sites installés par utilisateur .


Conseils pratiques

  • <package>.__path__vous permet d'identifier les emplacements d'un package spécifique: ( détails )

    $ python -c "import setuptools as _; print(_.__path__)"
    ['/usr/lib/python2.7/dist-packages/setuptools']
  • <module>.__file__vous permet d'identifier l'emplacement d'un module spécifique: ( différence )

    $ python3 -c "import os as _; print(_.__file__)"
    /usr/lib/python3.6/os.py
  • Exécutez pip show <package>pour afficher les informations sur les paquets de style 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
la source
17
il y a un répertoire de package de site dans un virtualenv. Vous pouvez obtenir le répertoire des modules spécifiques au site à l'intérieur / à l'extérieur de virtualenv en utilisant python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"(cela fonctionne aussi bien sur Python 2 que sur 3).
jfs
4
Agréable. Et pour obtenir le premier:python -c "import site; print(site.getsitepackages()[0])"
Brent Faust
2
Cela devrait être dans tout tutoriel de base sur l'utilisation de python. Je fais du python depuis des années et je ne connaissais pas le module du site. Cela aurait sauvé tant de maux de tête ...
salotz
1
J'ai suggéré une modification du tutoriel officiel de Python. Veuillez consulter le PR # 16974 pour plus de détails et merci pour la suggestion @salotz!
Peterino
1
Je pense que stackoverflow.com/a/52638888/1365918 est facilement la meilleure réponse à cette question.
kapad
652
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

(ou juste le premier article avec site.getsitepackages()[0])

eudoxos
la source
17
C'est bien mais, malheureusement, cette fonction n'est disponible qu'à partir de python2.7. Donc, bonne solution si vous utilisez python2.7 ou supérieur, mais ne travaillez pas pour python 2.6 et inférieur
Dan Niero
15
python -c "importation de site; print (site.getsitepackages ())"
Lars Schneider
29
J'obtiens AttributeError: l'objet 'module' n'a pas d'attribut 'getsitepackages' lors de l'utilisation avec virtualenv (python 2.7.8), la solution distutils ci-dessous fonctionne cependant.
radtek
8
@radtek: pour venv's, je détecte venv via hasattr(sys,'real_prefix'), puis je détermine les paquets du site de manière heuristique [p for p in sys.path if p.endswith('site-packages')][-1](et vérifie s'il y en a un avant de faire le [-1].
eudoxos
4
@radtek C'est un bug connu que le module de site ne fonctionne pas pour virtualenv github.com/pypa/virtualenv/issues/355
Guillem Cucurull
319

Une solution qui:

  • en dehors de virtualenv - fournit le chemin des packages de sites mondiaux ,
  • insidue a virtualenv - fournit les sites-packages de virtualenv

... est ce one-liner:

python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"

Formaté pour la lisibilité (plutôt que d'être utilisé comme une ligne), qui ressemble à ceci:

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


Source: une très ancienne version de la documentation "Comment installer Django" (bien que cela soit utile à plus qu'une simple installation de Django)

Daryl Spitzer
la source
1
Virtualenv fournit-il un moyen de trouver ses sites-packages?
Daryl Spitzer
10
Vous pouvez utiliser virtualenvwrapper, qui a la commande cdsitepackages, pour passer directement au répertoire des packages de site de l'environnement.
john2x
6
@PiotrDobrogost: fonctionne pour moi sur Python 2.7 dans un virtualenv sur Linux
RichVel
2
Le premier commentaire ne s'applique plus: cela montrait l'emplacement correct à l'extérieur et à l'intérieur d'un virtualenv.
astrojuanlu
2
N'a pas fonctionné pour moi sur Windows 10 en utilisant Linux bash, il revient à la /usr/lib/python3/dist-packagesplace de /usr/lib/python3.5/dist-packages.
Delgan
99

Pour Ubuntu ,

python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"

...n'est pas correcte.

Il vous indiquera /usr/lib/pythonX.X/dist-packages

Ce dossier contient uniquement les packages que votre système d'exploitation a installés automatiquement pour que les programmes s'exécutent.

Sur ubuntu , le dossier site-packages contenant les packages installés via setup_tools \ easy_install \ pip sera dans/usr/local/lib/pythonX.X/dist-packages

Le deuxième dossier est probablement le plus utile si le cas d'utilisation est lié à l'installation ou à la lecture du code source.

Si vous n'utilisez pas Ubuntu, vous pouvez probablement copier-coller en toute sécurité la première boîte de code dans le terminal.

David Hollander
la source
3
Si le demandeur est après l'emplacement d'un paquet particulier, module.__file__c'est la meilleure façon. S'ils essaient d'installer des choses… utilisez simplement les outils.
Tobu
'/usr/lib/pythonX.X/dist-packages' in site.getsitepackages()sur Ubuntu (même si cela va après /usr/local/... dans la liste). Vous n'obtenez que quelque chose /usr/localvia sudo pipet vous ne devriez pas utiliser sudo pipsur Ubuntu à moins que vous ayez décidé de faire votre propre distribution: si vous utilisez sudo pip, il est de votre responsabilité de vous assurer que toutes les dépendances des modules python actuels et futurs installés via sudo aptou sudo pipsont compatibles. Considérez quel problème a virtualenvété créé pour résoudre
jfs
Explication claire pour comprendre les différences du dist-packagesUbuntu 2 en (L).
Timo
69

C'est ce qui a fonctionné pour moi:

python -m site --user-site
Ramashri
la source
15
Pour moi, cela pointe vers un dossier qui n'existe même pas ( ~/.local/lib/python2.7/site-packages).
Neil Traft
1
même, dans OS X Mavericks, ma maison .local n'est pas ce que je voulais qu'elle trouve plus ouais ce n'est pas vraiment là de toute façon.
radtek
Son dans mon dossier principal / bibliothèque, j'ai dû y accéder manuellement, pour une raison quelconque, le chemin d'accès direct complet ne fonctionnait pas
efwjames
comment utiliser les packages installés ici? si je le fais, virtualenvil se plaint que le paquet n'existe pas. comment invoquer les packages installés à un emplacement personnalisé?
AbtPst
2
Cela vous indique où Python recherchera les packages spécifiques à l'utilisateur. Des commentaires comme «n'existe même pas» et «n'est pas ce que je voulais qu'il trouve» n'ont pas de sens dans ce contexte.
Honest Abe
28

Disons que vous avez installé le paquet 'django'. importez-le et tapez dir (django). Il vous montrera toutes les fonctions et attributs de ce module. Tapez l'interpréteur python -

>>> import django
>>> dir(django)
['VERSION', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'get_version']
>>> print django.__path__
['/Library/Python/2.6/site-packages/django']

Vous pouvez faire la même chose si vous avez installé mercurial.

C'est pour Snow Leopard. Mais je pense que cela devrait aussi fonctionner en général.

Sumod
la source
>>> import pg >>> print pg .__ path__ Traceback (dernier appel le plus récent): Fichier "<stdin>", ligne 1, dans <module> AttributeError: l'objet 'module' n'a pas d'attribut ' path '
Dannid
cela fonctionne, j'ai besoin de trouver le paquet sklearn à ajouter au chemin PYDEV, merci.
berkay
utiliser django.__file__pour cela plutôt que __path__. et, non, ce n'est pas une garantie que cela a quelque chose à voir avec les sites-packages, mais avec des choses comme django, que vous avez probablement installé pip , il le fera lorsque vous êtes pressé et il peut être utilisé pour à d'autres fins également (lecture d'un fichier de configuration par défaut à partir du système de fichiers par exemple).
JL Peyret
Sur la base de cela et d'autres réponses, vous pouvez le faire sur une seule ligne à partir de la ligne de commande pour obtenir le chemin d'accès à votre foo.barpackage:python -c "import foo.bar as _; print(_.__path__[0])"
snark
23

Comme d'autres l'ont noté, distutils.sysconfiga les paramètres pertinents:

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

... bien que la valeur par défaut site.pyfasse quelque chose d'un peu plus grossier, paraphrasé ci-dessous:

import sys, os
print os.sep.join([sys.prefix, 'lib', 'python' + sys.version[:3], 'site-packages'])

(il ajoute ${sys.prefix}/lib/site-pythonet ajoute également les deux chemins pour sys.exec_prefix, si cette constante est différente).

Cela dit, quel est le contexte? Vous ne devriez pas jouer avec votre site-packagesdirectement; setuptools / distutils fonctionnera pour l'installation, et votre programme peut s'exécuter dans un virtualenv où votre chemin python est complètement utilisateur local, il ne devrait donc pas non plus supposer l'utilisation directe des packages de site du système.

Charles Duffy
la source
3
fonctionne fiable avec python2sur osx et ubuntu avec et sans virtualenv mais pas avec python3du tout.
gigue
2
2008 était un peu en arrière - cette réponse était de trois mois avant la sortie de Python 3.0.
Charles Duffy
bien sûr, mais aujourd'hui, mon commentaire pourrait aider. corrigez-moi si je me trompe. de plus, je n'ai pas déçu cette réponse ni aucune autre en ce qui concerne python3.
gigue
22

Un moyen stdlib moderne utilise le sysconfigmodule, disponible dans les versions 2.7 et 3.2+.

Remarque : sysconfig( source ) ne doit pas être confondu avec le distutils.sysconfigsous - module ( source ) mentionné dans plusieurs autres réponses ici. Ce dernier est un module entièrement différent et il lui manque la get_pathsfonction décrite ci-dessous.

Python utilise actuellement huit chemins ( docs ):

  • stdlib : répertoire contenant les fichiers de bibliothèque Python standard qui ne sont pas spécifiques à la plate-forme.
  • platstdlib : répertoire contenant les fichiers de bibliothèque Python standard spécifiques à la plate-forme.
  • platlib : répertoire pour les fichiers spécifiques au site et spécifiques à la plate-forme.
  • purelib : répertoire pour les fichiers spécifiques au site et non spécifiques à la plate-forme.
  • include : répertoire pour les fichiers d'en-tête non spécifiques à la plate-forme.
  • platinclude : répertoire pour les fichiers d'en-tête spécifiques à la plate-forme.
  • scripts : répertoire des fichiers de script.
  • data : répertoire pour les fichiers de données.

Dans la plupart des cas, les utilisateurs qui trouvent cette question seraient intéressés par le chemin «purelib» (dans certains cas , vous pourriez également être intéressé par «platlib»). Contrairement à la réponse actuellement acceptée, cette méthode fonctionne toujours, que vous ayez activé ou non virtualenv.

Au niveau du système (il s'agit de Python 3.7.0 sur 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'

Avec un venv, vous obtiendrez quelque chose comme ça

>>> import sysconfig
>>> sysconfig.get_paths()['purelib']
'/private/tmp/.venv/lib/python3.7/site-packages'

Un script shell est également disponible pour afficher ces détails, que vous pouvez invoquer en exécutant en sysconfigtant que module:

python -m sysconfig
wim
la source
C'est une excellente réponse, je suis heureux que le nouveau module sysconfig facilite cela. Existe-t-il un moyen d'obtenir le préfixe local platlib, par exemple /usr/local/lib/python3.6/site-packages? Traditionnellement, les choses installées localement devraient entrer /usr/local.
eudoxos
Facilement la meilleure réponse à cette question! Je vous remercie. La seule chose que j'ai trouvée manquante était l'ordre dans lequel ces emplacements sont vérifiés lorsqu'une instruction d'importation est rencontrée. De plus, certains de ces emplacements sont-ils recherchés / mis en cache lors du chargement de python? Le savoir serait également utile à l'OMI.
kapad
21

Les paquets système natifs installés avec l'installation de python dans les systèmes basés sur Debian peuvent être trouvés sur:

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

Sous OSX - /Library/Python/2.7/site-packages

en utilisant ce petit code:

from distutils.sysconfig import get_python_lib
print get_python_lib()

Cependant, la liste des packages installés via pipse trouve sur:

/ usr / local / bin /

Ou on peut simplement écrire la commande suivante pour lister tous les chemins où se trouvent les packages python.

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

Remarque: l'emplacement peut varier en fonction de votre système d'exploitation, comme dans 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
la source
Si je me souviens bien, dist-packages est spécifique à Debian et à ses dérivés.
Samuel
1
@SamuelSantana vous avez raison. dist-packages sont spécifiques aux systèmes basés sur Debian. Dans ce cas j'ai invoqué site.getsitepackages()depuis l'installation du système d'où les dist-packages, les autres installations afficheront les sites-packages.
fnatic_shank
15

Toutes les réponses (ou: la même réponse répétée encore et encore) sont inadéquates. Ce que vous voulez faire, c'est ceci:

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 dernière ligne vous montre le répertoire d'installation. Fonctionne sur Ubuntu, contrairement aux précédents. Ne me posez pas de questions sur Windows ou d'autres dists, mais comme c'est exactement le même répertoire que easy_install utilise par défaut, il est probablement correct partout où easy_install fonctionne (donc partout, même sur mac). S'amuser. Remarque: le code d'origine contient de nombreux jurons.

tricheur
la source
1
Merci, c'est assez utile, sur py3 avec des crochets pour l'impression, il m'obtient /usr/local/lib/python3.4/dist-packages J'essaie de trouver comment obtenir /usr/lib/python3.4/dist -packages devra donc jouer plus loin.
Stuart Axon
4
nécessite une bibliothèque externe easy_installet n'échoue pas correctement s'il n'est pas disponible, ce qui est insuffisant :)
gigue
1
en effet, ce n'est pas parfait, mais cela a fonctionné pour moi et a pris beaucoup de temps à comprendre, donc je l'ai mis ici dans l'espoir que quelqu'un d'autre puisse s'appuyer sur le temps que j'ai déjà consacré à cela.
tricheur
13

Remarque: la solution proposée ( distutils.sysconfig.get_python_lib()) ne fonctionne pas lorsqu'il existe plusieurs répertoires de sites-packages (comme recommandé par cet article ). Il ne renverra que le répertoire principal des packages de site.

Hélas, je n'ai pas de meilleure solution non plus. Python ne semble pas garder la trace des répertoires des packages de sites, juste les packages qu'ils contiennent.

Vladimir Vagaytsev
la source
1
Je suppose que c'est la raison pour laquelle get_python_lib()lorsqu'il est exécuté à partir de virtualenv montre les packages de site de Python utilisés pour créer virtualenv et non les sites-packages de virtualenv .
Piotr Dobrogost
3
@Piotr C'était probablement un bogue dans distutils.sysconfig. Je viens de le tester et j'obtiens les packages internes du site, comme prévu.
Tobu
Également testé avec Python 2.7 installé dans un virtualenv sur Linux, et la méthode distutils.sysconfig fonctionne bien pour obtenir les packages de site de Python interne.
RichVel
12

Cela fonctionne pour moi. Il vous donnera à la fois les dossiers dist-packages et site-packages. Si le dossier n'est pas sur le chemin de Python, il ne vous sera pas très utile de toute façon.

import sys; 
print [f for f in sys.path if f.endswith('packages')]

Sortie (installation 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
la source
2
la réponse acceptée est la méthode recommandée, vous devriez donc dire pourquoi la vôtre est meilleure, car c'est un peu un hack
CharlesB
Quel est le problème avec un hack? ;) C'est plus simple et facile à comprendre et à retenir si vous travaillez de manière interactive.
just_an_old_guy
11

Cela devrait fonctionner sur toutes les distributions dans et hors de l'environnement virtuel en raison de sa nature "low-tech". Le module os réside toujours dans le répertoire parent de 'site-packages'

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

Pour changer dir en dir site-packages j'utilise l'alias suivant (sur les systèmes * nix):

alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'
Pyramid Newbie
la source
10

Une note supplémentaire à la get_python_libfonction mentionnée déjà: sur certaines plateformes, différents répertoires sont utilisés pour les modules spécifiques à la plateforme (par exemple: les modules qui nécessitent une compilation). Si vous passez plat_specific=Trueà la fonction, vous obtenez les packages de site pour les packages spécifiques à la plate-forme.

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

Réponse à une vieille question. Mais utilisez ipython pour cela.

pip install ipython
ipython 
import imaplib
imaplib?

Cela donnera la sortie suivante sur le paquet 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
la source
1
Ce n'est pas le répertoire site-packages, mais le répertoire dans lequel le package est installé. Cela n'est également utile que si vous utilisez iPython et non pour pouvoir obtenir par programme un répertoire d'installation.
danielunderwood
3

Vous devriez essayer cette commande pour déterminer l'emplacement d'installation de pip

Python 2

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

Python 3

pip3 show six | grep "Location:" | cut -d " " -f2
rouille
la source
1

Je devais faire quelque chose un peu différent pour un projet que je travaillais sur: trouver le rapport répertoire site-packages par rapport à la base préfixe installation. Si le dossier site-packages était dedans /usr/lib/python2.7/site-packages, je voulais la /lib/python2.7/site-packagespartie. En fait, j'ai rencontré des systèmes là où ils site-packagesse trouvaient /usr/lib64, et la réponse acceptée n'a PAS fonctionné sur ces systèmes.

Semblable à la réponse du tricheur, ma solution jette un coup d'œil dans les entrailles des Distutils, pour trouver le chemin qui se fait réellement passer à l'intérieur setup.py. C'était tellement pénible de comprendre que je ne veux pas que quiconque ait à le comprendre à nouveau.

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', ''))

Cela devrait imprimer quelque chose comme /Lib/site-packagesou /lib/python3.6/site-packages.

MultipleMonomials
la source
-2

S'il est déjà ajouté au, PYTHONPATHvous pouvez également faire quelque chose comme

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