Réponses:
Il existe deux types de répertoires de packages de site, globaux et par utilisateur .
Les répertoires globaux des packages de site (" dist-packages ") sont répertoriés sys.path
lorsque vous exécutez:
python -m site
Pour une liste plus concise exécutée à getsitepackages
partir du module de site en code Python:
python -c 'import site; print(site.getsitepackages())'
Remarque: Avec virtualenvs getsitepackages n'est pas disponible , sys.path
ci-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"])'
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 --help
pour des explications.
Astuce: en cours d'exécution pip list --user
ou pip freeze --user
vous donne une liste de tous les packages de sites installés par utilisateur .
<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
python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
(cela fonctionne aussi bien sur Python 2 que sur 3).
python -c "import site; print(site.getsitepackages()[0])"
>>> 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]
)
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]
.
Une solution qui:
... 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)
cdsitepackages
, pour passer directement au répertoire des packages de site de l'environnement.
/usr/lib/python3/dist-packages
place de /usr/lib/python3.5/dist-packages
.
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.
module.__file__
c'est la meilleure façon. S'ils essaient d'installer des choses… utilisez simplement les outils.
'/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/local
via sudo pip
et vous ne devriez pas utiliser sudo pip
sur 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 apt
ou sudo pip
sont compatibles. Considérez quel problème a virtualenv
été créé pour résoudre
dist-packages
Ubuntu 2 en (L).
C'est ce qui a fonctionné pour moi:
python -m site --user-site
~/.local/lib/python2.7/site-packages
).
virtualenv
il se plaint que le paquet n'existe pas. comment invoquer les packages installés à un emplacement personnalisé?
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.
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).
foo.bar
package:python -c "import foo.bar as _; print(_.__path__[0])"
Comme d'autres l'ont noté, distutils.sysconfig
a les paramètres pertinents:
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 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-python
et 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-packages
directement; 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.
python2
sur osx et ubuntu avec et sans virtualenv mais pas avec python3
du tout.
python3
.
Un moyen stdlib moderne utilise le sysconfig
module, disponible dans les versions 2.7 et 3.2+.
Remarque : sysconfig
( source ) ne doit pas être confondu avec le distutils.sysconfig
sous - module ( source ) mentionné dans plusieurs autres réponses ici. Ce dernier est un module entièrement différent et il lui manque la get_paths
fonction 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 sysconfig
tant que module:
python -m sysconfig
platlib
, par exemple /usr/local/lib/python3.6/site-packages
? Traditionnellement, les choses installées localement devraient entrer /usr/local
.
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 pip
se 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']
site.getsitepackages()
depuis l'installation du système d'où les dist-packages, les autres installations afficheront les sites-packages.
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.
easy_install
et n'échoue pas correctement s'il n'est pas disponible, ce qui est insuffisant :)
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.
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 .
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']
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'
Une note supplémentaire à la get_python_lib
fonction 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.
from distutils.sysconfig import get_python_lib
print get_python_lib()
pip show donnera tous les détails sur un package: https://pip.pypa.io/en/stable/reference/pip_show/ [pip show] [1]
Pour obtenir l'emplacement:
pip show <package_name>| grep Location
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
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-packages
partie. En fait, j'ai rencontré des systèmes là où ils site-packages
se 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-packages
ou /lib/python3.6/site-packages
.
pip show <package name>