Antworten:
Es gibt zwei Arten von Site-Paket-Verzeichnissen: global und pro Benutzer .
Globale Site-Packages - Verzeichnisse (" dist-packages ") werden aufgelistet, sys.pathwenn Sie Folgendes ausführen:
python -m site
Für eine übersichtlichere Liste, die getsitepackagesvom Site-Modul in Python-Code ausgeführt wird:
python -c 'import site; print(site.getsitepackages())'
Hinweis: Bei virtualenvs ist getsitepackages nicht verfügbar . sys.pathVon oben wird das Site-Packages-Verzeichnis von virtualenv jedoch korrekt aufgelistet. In Python 3 können Sie stattdessen das Modul sysconfig verwenden:
python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])'Im Verzeichnis der Benutzer- Site-Pakete ( PEP 370 ) pro Benutzer installiert Python Ihre lokalen Pakete:
python -m site --user-site
Wenn dies auf ein nicht vorhandenes Verzeichnis verweist, überprüfen Sie den Exit-Status von Python und finden Sie python -m site --helpErklärungen.
Tipp: Wird ausgeführt pip list --useroder pip freeze --usergibt Ihnen eine Liste aller pro Benutzer installierten Site-Pakete.
<package>.__path__Mit dieser Option können Sie die Speicherorte eines bestimmten Pakets identifizieren: ( Details )
$ python -c "import setuptools as _; print(_.__path__)"
['/usr/lib/python2.7/dist-packages/setuptools']<module>.__file__Mit dieser Option können Sie den Standort eines bestimmten Moduls ermitteln: ( Unterschied )
$ python3 -c "import os as _; print(_.__file__)"
/usr/lib/python3.6/os.pyFühren Sie es aus pip show <package>, um Paketinformationen im Debian-Stil anzuzeigen:
$ 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, pluggypython -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"(es funktioniert sowohl unter Python 2 als auch unter Python 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']
(oder nur erster Artikel mit site.getsitepackages()[0])
hasattr(sys,'real_prefix')und bestimme dann Site-Pakete heuristisch aus [p for p in sys.path if p.endswith('site-packages')][-1](plus überprüfe, ob es eines gefunden hat, bevor ich das mache [-1].
Eine Lösung, die:
... ist das einzeilig:
python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
Aus Gründen der Lesbarkeit formatiert (anstatt als Einzeiler verwendet zu werden), sieht dies wie folgt aus:
from distutils.sysconfig import get_python_lib
print(get_python_lib())
Quelle: Eine sehr alte Version der Dokumentation "So installieren Sie Django" (obwohl dies nicht nur für die Installation von Django nützlich ist)
cdsitepackages, um direkt in das Site-Packages-Verzeichnis der Umgebung zu wechseln.
/usr/lib/python3/dist-packagesstattdessen zurückgegeben /usr/lib/python3.5/dist-packages.
Für Ubuntu ,
python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
...das ist nicht richtig.
Es wird Sie darauf hinweisen /usr/lib/pythonX.X/dist-packages
Dieser Ordner enthält nur Pakete, die Ihr Betriebssystem automatisch installiert hat, damit Programme ausgeführt werden können.
Unter Ubuntu befindet sich der Ordner site-packages, der Pakete enthält, die über setup_tools \ easy_install \ pip installiert wurden/usr/local/lib/pythonX.X/dist-packages
Der zweite Ordner ist wahrscheinlich der nützlichere, wenn der Anwendungsfall mit der Installation oder dem Lesen des Quellcodes zusammenhängt.
Wenn Sie Ubuntu nicht verwenden, können Sie die erste Codebox wahrscheinlich sicher in das Terminal einfügen.
module.__file__ist dies der bessere Weg. Wenn sie versuchen, Dinge zu installieren, verwenden Sie einfach die Tools.
'/usr/lib/pythonX.X/dist-packages' in site.getsitepackages()auf Ubuntu (obwohl es geht nach /usr/local/... in der Liste). Sie erhalten nur etwas in /usr/localvia sudo pipund sollten es nicht sudo pipunter Ubuntu verwenden sudo pip, es sei denn, Sie haben sich für eine eigene Distribution entschieden. Wenn Sie es verwenden , liegt es in Ihrer Verantwortung, sicherzustellen, dass alle Abhängigkeiten der aktuellen und zukünftigen Python-Module, die über sudo aptoder installiert sudo pipsind, kompatibel sind. Überlegen Sie, welches Problem virtualenvzur Lösung erstellt wurde
dist-packagesin (L) Ubuntu zu verstehen .
Das hat bei mir funktioniert:
python -m site --user-site
~/.local/lib/python2.7/site-packages).
virtualenv, beschwert es sich, dass das Paket nicht existiert. Wie rufe ich die an einem benutzerdefinierten Speicherort installierten Pakete auf?
Angenommen, Sie haben das Paket 'django' installiert. importiere es und tippe dir (django) ein. Es zeigt Ihnen alle Funktionen und Attribute dieses Moduls. Geben Sie den Python-Interpreter ein -
>>> import django
>>> dir(django)
['VERSION', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'get_version']
>>> print django.__path__
['/Library/Python/2.6/site-packages/django']
Sie können dasselbe tun, wenn Sie mercurial installiert haben.
Dies ist für Schneeleopard. Aber ich denke, es sollte auch allgemein funktionieren.
django.__file__dafür eher als __path__. und nein, es ist keine Garantie dafür, dass dies irgendetwas mit Site-Paketen zu tun hat, aber mit Dingen wie Django, die Sie höchstwahrscheinlich installiert haben , funktioniert es, wenn Sie es eilig haben und für die es verwendet werden kann auch für andere Zwecke (z. B. Lesen einer Standardkonfigurationsdatei aus dem Dateisystem).
foo.barPaket zu erhalten:python -c "import foo.bar as _; print(_.__path__[0])"
Wie andere angemerkt haben, distutils.sysconfighat die relevanten Einstellungen:
import distutils.sysconfig
print distutils.sysconfig.get_python_lib()
... obwohl die Standardeinstellung site.pyetwas gröberes macht, wie unten umschrieben:
import sys, os
print os.sep.join([sys.prefix, 'lib', 'python' + sys.version[:3], 'site-packages'])
(Es werden auch ${sys.prefix}/lib/site-pythonbeide Pfade hinzugefügt und hinzugefügt sys.exec_prefix, falls diese Konstante unterschiedlich sein sollte.)
Das heißt, was ist der Kontext? Sie sollten nicht direkt mit Ihrem site-packagesherumspielen; setuptools / distutils funktionieren für die Installation, und Ihr Programm wird möglicherweise in einer virtuellen Umgebung ausgeführt, in der Ihr Python-Pfad vollständig benutzerlokal ist. Daher sollte es auch nicht davon ausgehen, dass die Site-Pakete des Systems direkt verwendet werden.
python2auf osx und ubuntu mit und ohne virtualenv aber überhaupt nicht mit python3.
python3.
Eine moderne stdlib-Methode ist die Verwendung von sysconfigModulen, die in den Versionen 2.7 und 3.2+ verfügbar sind.
Hinweis : sysconfig( Quelle ) ist nicht mit dem in mehreren anderen Antworten hier erwähnten distutils.sysconfigSubmodul ( Quelle ) zu verwechseln . Letzteres ist ein ganz anderes Modul und es fehlt dasget_paths unten diskutierte Funktion.
Python verwendet derzeit acht Pfade ( Dokumente ):
- stdlib : Verzeichnis mit den Standard-Python-Bibliotheksdateien, die nicht plattformspezifisch sind.
- platstdlib : Verzeichnis mit den plattformspezifischen Standard-Python-Bibliotheksdateien.
- platlib : Verzeichnis für ortsspezifische, plattformspezifische Dateien.
- purelib : Verzeichnis für ortsspezifische, nicht plattformspezifische Dateien.
- include : Verzeichnis für nicht plattformspezifische Header-Dateien.
- platinclude : Verzeichnis für plattformspezifische Header-Dateien.
- Skripte : Verzeichnis für Skriptdateien.
- data : Verzeichnis für Datendateien.
In den meisten Fällen interessieren sich Benutzer, die diese Frage finden, für den Pfad "purelib" (in einigen Fällen sind Sie möglicherweise auch für "platlib" interessiert). Im Gegensatz zur aktuell akzeptierten Antwort funktioniert diese Methode weiterhin, unabhängig davon, ob Sie eine virtuelle Umgebung aktiviert haben oder nicht.
Auf Systemebene (dies ist Python 3.7.0 unter 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'
Mit einem Venv bekommst du so etwas
>>> import sysconfig
>>> sysconfig.get_paths()['purelib']
'/private/tmp/.venv/lib/python3.7/site-packages'
Zur Anzeige dieser Details steht auch ein Shell-Skript zur Verfügung, das Sie durch Ausführen sysconfigals Modul aufrufen können :
python -m sysconfig
platlib, z /usr/local/lib/python3.6/site-packages. Traditionell sollten lokal installierte Dinge eingesetzt werden /usr/local.
Die nativen Systempakete, die mit der Python-Installation auf Debian-basierten Systemen installiert wurden, finden Sie unter:
/usr/lib/python2.7/dist-packages/
In OSX - /Library/Python/2.7/site-packages
mit diesem kleinen Code:
from distutils.sysconfig import get_python_lib
print get_python_lib()
Die Liste der über installierten Pakete pipfinden Sie jedoch unter:
/ usr / local / bin /
Oder Sie können einfach den folgenden Befehl schreiben, um alle Pfade aufzulisten, in denen sich Python-Pakete befinden.
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
Hinweis: Der Speicherort kann je nach Betriebssystem variieren, wie in 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()von der Systeminstallation aus die dist-Pakete aufgerufen , andere Installationen zeigen Site-Pakete an.
Alle Antworten (oder: dieselbe Antwort, die immer wieder wiederholt wird) sind unzureichend. Was Sie tun möchten, ist Folgendes:
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
Die letzte Zeile zeigt Ihnen das Installationsverzeichnis. Funktioniert unter Ubuntu, die oben genannten nicht. Fragen Sie mich nicht nach Windows oder anderen Dists, aber da es genau das gleiche Verzeichnis ist, das easy_install standardmäßig verwendet, ist es wahrscheinlich überall dort richtig, wo easy_install funktioniert (also überall, sogar auf Macs). Habe Spaß. Hinweis: Der Originalcode enthält viele Schimpfwörter.
easy_installund schlägt nicht ordnungsgemäß fehl, wenn sie nicht verfügbar ist, was nicht ausreicht :)
Eine Randnotiz: Die vorgeschlagene Lösung ( distutils.sysconfig.get_python_lib()) funktioniert nicht, wenn mehr als ein Site-Packages-Verzeichnis vorhanden ist (wie in diesem Artikel empfohlen ). Es wird nur das Hauptverzeichnis der Site-Pakete zurückgegeben.
Leider habe ich auch keine bessere Lösung. Python scheint nicht die Verzeichnisse von Site-Paketen zu verfolgen, sondern nur die darin enthaltenen Pakete.
get_python_lib()wenn sie von innerhalb virtualenv Shows laufen wird Website-Pakete von Python verwendet , um virtualenv und nicht die von virtualenv site-packages .
Das funktioniert bei mir. Sie erhalten sowohl Ordner für dist-Pakete als auch für Site-Pakete. Wenn sich der Ordner nicht auf Pythons Pfad befindet, wird er Ihnen sowieso nicht viel nützen.
import sys;
print [f for f in sys.path if f.endswith('packages')]
Ausgabe (Ubuntu-Installation):
['/home/username/.local/lib/python2.7/site-packages',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages']
Dies sollte auf allen Distributionen in und außerhalb der virtuellen Umgebung funktionieren, da es sich um "Low-Tech" handelt. Das OS-Modul befindet sich immer im übergeordneten Verzeichnis von 'Site-Paketen'.
import os; print(os.path.dirname(os.__file__) + '/site-packages')
Um dir in das Site-Paket-Verzeichnis zu ändern, verwende ich den folgenden Alias (auf * nix-Systemen):
alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'
Ein zusätzlicher Hinweis zu der get_python_libbereits erwähnten Funktion: Auf einigen Plattformen werden unterschiedliche Verzeichnisse für plattformspezifische Module verwendet (z. B. Module, die kompiliert werden müssen). Wenn Sie plat_specific=Truean die Funktion übergeben, erhalten Sie die Site-Pakete für plattformspezifische Pakete.
from distutils.sysconfig import get_python_lib
print get_python_lib()
pip show gibt alle Details zu einem Paket an: https://pip.pypa.io/en/stable/reference/pip_show/ [pip show] [1]
So ermitteln Sie den Standort:
pip show <package_name>| grep Location
Antwort auf alte Frage. Verwenden Sie dazu jedoch ipython.
pip install ipython
ipython
import imaplib
imaplib?
Dies gibt die folgende Ausgabe über das imaplib-Paket -
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
Ich musste für ein Projekt, an dem ich arbeitete, etwas anderes tun: Suchen Sie das relative Site-Packages-Verzeichnis relativ zum Basisinstallationspräfix. Wenn sich der Site-Packages-Ordner befand /usr/lib/python2.7/site-packages, wollte ich das /lib/python2.7/site-packagesTeil. Ich bin in der Tat auf Systeme gestoßen, in denen es sich site-packagesbefand /usr/lib64, und die akzeptierte Antwort funktionierte auf diesen Systemen NICHT.
Ähnlich wie bei der Antwort des Betrügers späht meine Lösung tief in die Eingeweide von Distutils, um den Weg zu finden, der tatsächlich im Inneren herumgereicht wird setup.py. Es war so schmerzhaft herauszufinden, dass ich nicht möchte, dass jemand dies jemals wieder herausfinden muss.
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', ''))
Das sollte so etwas wie /Lib/site-packagesoder drucken /lib/python3.6/site-packages.
pip show <package name>