Comment trouver l'emplacement de mon répertoire de packages de site Python ?
-
02-07-2019 - |
Question
Comment trouver l’emplacement de mon répertoire site-packages ?
La solution
Il existe deux types de répertoires de packages de sites, global et par utilisateur .
-
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. -
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))