web-dev-qa-db-fra.com

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

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

752
Daryl Spitzer
>>> 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])

627
eudoxos

À partir de La documentation "Comment installer Django" (bien que cela soit utile pour plus que l'installation de Django) - exécutez ce qui suit à partir du shell:

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

Formaté pour la lisibilité (plutôt que comme une ligne), il ressemble à ceci:

from distutils.sysconfig import get_python_lib
print(get_python_lib())
301
Daryl Spitzer

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 ne contient que les packages que votre système d'exploitation a automatiquement installés pour permettre l'exécution des programmes.

Sur ubuntu , le dossier site-packages qui contient 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.

98
David Hollander

C'est ce qui a fonctionné pour moi:

python -m site --user-site
64
Ramashri

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.

Ceci est pour Snow Leopard. Mais je pense que cela devrait également fonctionner en général.

22
Sumod

Comme d'autres l'ont noté, distutils.sysconfig possède les paramètres appropriés:

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

... bien que le site.py par défaut fasse quelque chose d'un peu plus brut, paraphrasé ci-dessous:

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

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

Cela dit, quel est le contexte? Vous ne devriez pas jouer directement avec votre site-packages; setuptools/distutils fonctionnera pour l’installation et votre programme pourrait s’exécuter dans un virtualenv où votre pythonpath est complètement local à l’utilisateur. Par conséquent, il ne devrait pas non plus assumer l’utilisation directe des packages de site système.

21
Charles Duffy

Les packages système natifs installés avec l’installation de Python dans les systèmes Debian sont disponibles à l’adresse suivante:

/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 pip est disponible à l'adresse suivante:

/ usr/local/bin /

Vous pouvez également écrire la commande suivante pour répertorier 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']
15
fnatic_shank

Toutes les réponses (ou: la même réponse répétée maintes et maintes) sont inadéquates. Ce que vous voulez faire 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 à celles ci-dessus. Ne me posez pas de questions sur Windows ou d’autres distributions, mais comme c’est exactement le même répertoire que easy_install, il est probablement correct partout où easy_install fonctionne (donc, partout, même sur les macs). S'amuser. Remarque: le code d'origine contient de nombreux jurons.

13
cheater

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

Hélas, je n'ai pas de meilleure solution non plus. Python ne semble pas suivre les répertoires de sites-packages, mais uniquement les paquets qu’ils contiennent.

11
user147100

Cela fonctionne pour moi . Il vous rapportera les dossiers dist-packages et site-packages . Si le dossier n'est pas sur le chemin de Python, ce ne sera pas.

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']
9
just_an_old_guy

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

8
Armin Ronacher

Cela devrait fonctionner sur toutes les distributions entrant et sortant 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 package site dir, 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'
8
Pyramid Newbie
from distutils.sysconfig import get_python_lib
print get_python_lib()
7
Florian Bösch

pip show donnera tous les détails sur un paquet: https://pip.pypa.io/en/stable/reference/pip_show/ [pip show] [1]

Pour obtenir l'emplacement:

pip show <package_name>| grep Location
3
Sourabh Potnis

Une méthode stdlib moderne utilise sysconfig module, disponible dans les versions 2.7 et 3.2+. Python utilise actuellement huit chemins ( docs ):

  • stdlib: répertoire contenant les fichiers de la 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 à la plateforme et au site.
  • purelib: répertoire des fichiers non spécifiques à la plate-forme, spécifiques à un site.
  • include: répertoire des fichiers d'en-tête non spécifiques à la plate-forme.
  • platinclude: répertoire des fichiers d'en-tête spécifiques à la plate-forme.
  • scripts: répertoire des fichiers de script.
  • data: répertoire des fichiers de données.

Dans la plupart des cas, les utilisateurs qui trouveraient cette question seraient intéressés par le chemin 'purelib' (dans dans certains cas , vous pourriez être intéressé aussi par 'platlib'). Contrairement à la réponse actuellement acceptée, cette méthode ne devrait pas mal se comporter, que vous ayez ou non activé un virtualenv.

Au niveau du système (il s’agit de Python 3.7.0 sous 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 appeler en exécutant sysconfig en tant que module:

python -m sysconfig

Note:sysconfig ( source ) ne doit pas être confondu avec le sous-module distutils.sysconfig ( source ) mentionné dans plusieurs autres réponses ici. C'est un module totalement différent et il manque la fonction get_paths décrite ci-dessus.

3
wim

Répondez à la 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
2
Sahil Agarwal

Je devais faire quelque chose de légèrement différent pour un projet sur lequel je travaillais: trouver le répertoire relative site-packages par rapport au préfixe d'installation de base. Si le dossier site-packages était dans /usr/lib/python2.7/site-packages, je voulais la partie /lib/python2.7/site-packages. En fait, j'ai rencontré des systèmes où site-packages était dans /usr/lib64, et la réponse acceptée ne fonctionnait PAS sur ces systèmes. 

Semblable à la réponse du tricheur, ma solution jette un coup d’œil fou dans les entrailles de Distutils, pour trouver le chemin qui est réellement contourné dans setup.py. C'était tellement pénible de comprendre que je ne veux pas que quelqu'un soit obligé de 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-packages ou /lib/python3.6/site-packages.

0
MultipleMonomials

S'il est déjà ajouté à la PYTHONPATH, vous pouvez également faire quelque chose comme

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

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
0
rust