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

StackOverflow https://stackoverflow.com/questions/122327

  •  02-07-2019
  •  | 
  •  

Question

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

Était-ce utile?

La solution

Il existe deux types de répertoires de packages de sites, global et par utilisateur .

  1. Sites globaux (& <; href = "https://stackoverflow.com/questions/9387928/whats-the-difference-between-dist- packages-and-site-packages "> dist-packages ") sont répertoriés dans sys.path lorsque vous exécutez:

    python -m site
    

    Pour une liste plus concise, exécutez getsitepackages à partir du module de site en code Python:

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

    Remarque: Avec virtualenvs, getsitepackages n'est pas disponible , python -m site --help ci-dessus listera correctement le répertoire site-packages de virtualenv.

  2. Le répertoire par utilisateur de packages de sites ( PEP 370 ) est l’endroit où Python installe vos paquets locaux:

    python -m site --user-site
    

    Si cela pointe vers un répertoire non existant, vérifiez le statut de sortie de Python et consultez pip list --user les explications.

    Conseil: Exécuter pip freeze --user ou <package>.__path__ vous donne la liste de tous les packages de site par utilisateur installés.

Conseils pratiques

  • <module>.__file__ vous permet d'identifier l'emplacement d'un package spécifique: ( détails )

    $ python -c "import setuptools as _; print(_.__path__)"
    ['/usr/lib/python2.7/dist-packages/setuptools']
    
  • pip show <package> 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 <=> pour afficher les informations sur les packages 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
    

Autres conseils

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

(ou juste le premier élément avec site.getsitepackages()[0])

De " ; Comment installer Django & Quot; documentation (bien que cela soit utile pour plus que l'installation de Django) - exécutez les opérations suivantes à partir du shell:

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

Formaté pour la lisibilité (plutôt que de l'utiliser comme une ligne), cela ressemble à ce qui suit:

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

Pour Ubuntu ,

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

... n'est pas correct.

Il vous dirigera vers /usr/lib/pythonX.X/dist-packages

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

Sur ubuntu , le dossier sites-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.

Voici ce qui a fonctionné pour moi:

python -m site --user-site

Supposons que vous ayez installé le paquet "Django". importez-le et tapez dir (django). Il vous montrera toutes les fonctions et attributs de ce module. Saisissez 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.

Comme d'autres l'ont noté, distutils.sysconfig dispose des paramètres appropriés:

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

... bien que la valeur par défaut site.py fasse quelque chose d'un peu plus brutal, 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 d'accès pour sys.exec_prefix également, 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-utilisateur. Par conséquent, il ne devrait pas non plus assumer l’utilisation directe des packages de site système.

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

  

/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

.
  

/ 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']

Toutes les réponses (ou la même réponse répétée) sont inadéquates. Voici ce que vous voulez faire:

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.

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és 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 paquets de sites, mais uniquement les paquets qu’ils contiennent.

Cela fonctionne pour moi. Vous obtiendrez les dossiers dist-packages et site-packages. Si le dossier n'est pas sur le chemin de Python, ce ne sera pas vous faire beaucoup de bien quand même.

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

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.

Ceci devrait fonctionner sur toutes les distributions entrant et sortant de l'environnement virtuel car & "; low-tech &"; la nature. 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 paquet-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'
from distutils.sysconfig import get_python_lib
print get_python_lib()

Une méthode stdlib moderne utilise sysconfig module, disponible en version 2.7 et 3.2+.Python utilise actuellement huit chemins (documents):

  • bibliothèque 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 à la plate-forme.
  • purelib:répertoire pour les fichiers spécifiques au site et non spécifiques à la plate-forme.
  • inclure: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 pour les fichiers de script.
  • données:répertoire pour les fichiers de données.

Dans la plupart des cas, les utilisateurs trouvant cette question seraient intéressés par le chemin « purelib » (en certains cas, vous pourriez aussi être intéressé par 'platlib').Contrairement à la réponse actuellement acceptée, cette méthode ne devrait pas mal se comporter selon que vous avez activé ou non un 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 appeler en exécutant sysconfig en module :

python -m sysconfig

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

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

Pour obtenir l'emplacement:

pip show <package_name>| grep Location

Répondez à l'ancienne question. Mais utilisez ipython pour cela.

pip install ipython
ipython 
import imaplib
imaplib?

Ceci 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

Je devais faire quelque chose de légèrement différent pour un projet sur lequel je travaillais: trouver le répertoire relatif 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’oeil fou dans les entrailles de Distutils, pour trouver le chemin qui est réellement contourné à l’intérieur de setup.py. C'était tellement pénible de comprendre que je ne veux pas que quiconque 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.

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

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

import sys
print('\n'.join(sys.path))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top