Wie finde ich den Speicherort meines Python-Site-Packages-Verzeichnisses?

942

Wie finde ich den Speicherort meines Site-Packages-Verzeichnisses?

Daryl Spitzer
quelle
63
Wenn Sie nur den genauen Ort eines Pakets wünschen, können Sie verwendenpip show <package name>
Joshuakcockrell

Antworten:

532

Es gibt zwei Arten von Site-Paket-Verzeichnissen: global und pro Benutzer .

  1. 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"])'
  2. 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.


Praktische Tipps

  • <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.py
  • Fü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, pluggy
Peterino
quelle
17
In einer virtuellen Umgebung befindet sich ein Site-Paketverzeichnis. Sie können das Verzeichnis für ortsspezifische Module innerhalb / außerhalb von virtualenv mit abrufen python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"(es funktioniert sowohl unter Python 2 als auch unter Python 3).
JFS
4
Nett. Und um den ersten zu bekommen:python -c "import site; print(site.getsitepackages()[0])"
Brent Faust
2
Dies sollte in jedem grundlegenden Tutorial zur Verwendung von Python enthalten sein. Ich habe jahrelang Python gemacht und wusste nichts über das Site-Modul. Hätte so viele Kopfschmerzen
erspart
1
Ich habe eine Änderung an Pythons offiziellem Tutorial vorgeschlagen. Weitere Informationen finden Sie in PR # 16974 und vielen Dank für den Vorschlag @salotz!
Peterino
1
Ich denke, stackoverflow.com/a/52638888/1365918 ist einfach die beste Antwort auf diese Frage.
Kapad
652
>>> 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])

Eudoxos
quelle
17
Das ist gut, aber leider ist diese Funktion nur in Python2.7 verfügbar. Also, schöne Lösung, wenn Sie Python2.7 oder höher verwenden, aber nicht für Python 2.6 und
niedriger arbeiten
15
python -c "import site; print (site.getsitepackages ())"
Lars Schneider
29
Ich erhalte AttributeError: Das Objekt 'module' hat bei Verwendung von virtualenv (Python 2.7.8) kein Attribut 'getsitepackages'. Die folgende distutils-Lösung funktioniert jedoch.
Radtek
8
@radtek: für venv's erkenne ich venv via 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].
eudoxos
4
@radtek Es ist ein bekannter Fehler, dass das Site-Modul für virtualenv nicht funktioniert. github.com/pypa/virtualenv/issues/355
Guillem Cucurull
319

Eine Lösung, die:

  • außerhalb von virtualenv - liefert den Pfad globaler Site-Pakete,
  • insidue ein virtualenv - bietet die von virtualenv site-packages

... 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)

Daryl Spitzer
quelle
1
Bietet virtualenv eine Möglichkeit, seine Site-Pakete zu finden?
Daryl Spitzer
10
Sie können virtualenvwrapper mit dem Befehl verwenden cdsitepackages, um direkt in das Site-Packages-Verzeichnis der Umgebung zu wechseln.
John2x
6
@PiotrDobrogost: funktioniert für mich unter Python 2.7 in einer virtuellen Umgebung unter Linux
RichVel
2
Der erste Kommentar gilt nicht mehr: Hier wurde der richtige Ort sowohl außerhalb als auch innerhalb einer virtuellen Umgebung angezeigt.
Astrojuanlu
2
Hat bei mir unter Windows 10 mit Linux Bash nicht funktioniert, es wird /usr/lib/python3/dist-packagesstattdessen zurückgegeben /usr/lib/python3.5/dist-packages.
Delgan
99

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.

David Hollander
quelle
3
Wenn der Fragesteller nach dem Standort eines bestimmten Pakets sucht, module.__file__ist dies der bessere Weg. Wenn sie versuchen, Dinge zu installieren, verwenden Sie einfach die Tools.
Tobu
'/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
jfs
Klare Erklärung, um die Unterschiede der 2 dist-packagesin (L) Ubuntu zu verstehen .
Timo
69

Das hat bei mir funktioniert:

python -m site --user-site
Ramashri
quelle
15
Für mich zeigt dies auf einen Ordner, der nicht einmal existiert ( ~/.local/lib/python2.7/site-packages).
Neil Traft
1
Ebenso ist in OS X Mavericks mein Heimatort nicht das, was ich wollte, und ja, es ist sowieso nicht wirklich da.
Radtek
Es ist in meinem Haupt- / Bibliotheksordner, ich musste manuell
dorthin
Wie verwende ich die hier installierten Pakete? Wenn ich es tue virtualenv, beschwert es sich, dass das Paket nicht existiert. Wie rufe ich die an einem benutzerdefinierten Speicherort installierten Pakete auf?
AbtPst
2
Hier erfahren Sie, wo Python nach benutzerspezifischen Paketen sucht. Kommentare wie "existiert nicht einmal" und "ist nicht das, was ich wollte" machen in diesem Zusammenhang keinen Sinn.
Ehrliche Abe
28

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.

Sumod
quelle
>>> pg importieren >>> pg drucken .__ path__ Traceback (letzter Aufruf zuletzt): Datei "<stdin>", Zeile 1, in <module> AttributeError: '
module'
es funktioniert, ich muss das sklearn-Paket finden, um es dem PYDEV-Pfad hinzuzufügen, danke.
Berkeley
Verwenden Sie 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).
JL Peyret
Basierend auf dieser und anderen Antworten können Sie dies in einer Zeile über die Befehlszeile tun, um den Pfad zu Ihrem foo.barPaket zu erhalten:python -c "import foo.bar as _; print(_.__path__[0])"
Snark
23

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.

Charles Duffy
quelle
3
funktioniert zuverlässig mit python2auf osx und ubuntu mit und ohne virtualenv aber überhaupt nicht mit python3.
Jitter
2
2008 war eine Weile her - diese Antwort war drei Monate vor der Veröffentlichung von Python 3.0.
Charles Duffy
sicher, aber heute könnte mein Kommentar helfen. korrigiere mich, wenn ich falsch liege. Außerdem habe ich diese oder eine andere Antwort in Bezug auf nicht abgelehnt python3.
Jitter
22

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
wim
quelle
Dies ist eine großartige Antwort. Ich bin froh, dass das neue sysconfig-Modul dies einfacher macht. Gibt es eine Möglichkeit, das lokale Präfix abzurufen platlib, z /usr/local/lib/python3.6/site-packages. Traditionell sollten lokal installierte Dinge eingesetzt werden /usr/local.
Eudoxos
Einfach die beste Antwort auf diese Frage! Vielen Dank. Das einzige, was mir fehlte, war die Reihenfolge, in der diese Speicherorte überprüft werden, wenn eine Importanweisung gefunden wird. Wird einer dieser Speicherorte beim Laden von Python vorab gesucht / zwischengespeichert? Das zu wissen wäre auch nützlich, IMO.
Kapad
21

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']
fnatic_shank
quelle
Wenn ich mich richtig erinnere, sind dist-Pakete spezifisch für Debian und Derivate.
Samuel
1
@SamuelSantana du bist richtig. dist-Pakete sind spezifisch für Debian-basierte Systeme. In diesem Fall habe ich site.getsitepackages()von der Systeminstallation aus die dist-Pakete aufgerufen , andere Installationen zeigen Site-Pakete an.
fnatic_shank
15

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.

Betrüger
quelle
1
Danke, das ist ziemlich nützlich. Auf py3 mit Klammern zum Drucken bekomme ich /usr/local/lib/python3.4/dist-packages. Ich versuche herauszufinden, wie ich /usr/lib/python3.4/dist bekomme -Pakete müssen also weiter spielen.
Stuart Axon
4
erfordert eine externe Bibliothek easy_installund schlägt nicht ordnungsgemäß fehl, wenn sie nicht verfügbar ist, was nicht ausreicht :)
Jitter
1
Das ist zwar nicht perfekt, aber es hat bei mir funktioniert und viel Zeit in Anspruch genommen, um es herauszufinden. Deshalb habe ich es hier in der Hoffnung platziert, dass jemand anderes auf der Zeit aufbauen kann, die ich bereits damit verbracht habe.
Betrüger
13

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.

Vladimir Vagaytsev
quelle
1
Ich denke , das ist der Grund , warum , 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 .
Piotr Dobrogost
3
@Piotr Das war wahrscheinlich ein Fehler in distutils.sysconfig. Ich habe es gerade getestet und bekomme wie erwartet die inneren Site-Pakete.
Tobu
Wird auch mit Python 2.7 getestet, das in einer virtuellen Umgebung unter Linux installiert ist, und die Methode distutils.sysconfig funktioniert einwandfrei, um die Site-Pakete des inneren Python abzurufen.
RichVel
12

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']
just_an_old_guy
quelle
2
akzeptierte Antwort ist der empfohlene Weg, also sollten Sie sagen, warum Ihre besser ist, da es ein bisschen ein Hack ist
CharlesB
Was ist los mit einem Hack? ;) Es ist einfacher und leichter zu verstehen und sich zu erinnern, wenn Sie interaktiv arbeiten.
just_an_old_guy
11

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'
Pyramid Newbie
quelle
10

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.

Armin Ronacher
quelle
8
from distutils.sysconfig import get_python_lib
print get_python_lib()
Florian Bösch
quelle
3

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
Sahil Agarwal
quelle
1
Dies ist nicht das Verzeichnis site-packages, sondern das Verzeichnis, in dem das Paket installiert ist. Dies ist auch nur hilfreich, wenn Sie iPython verwenden und nicht programmgesteuert ein Installationsverzeichnis abrufen können.
Danielunderwood
3

Sie sollten diesen Befehl versuchen, um den Installationsort von pip zu bestimmen

Python 2

pip show six | grep "Location:" | cut -d " " -f2

Python 3

pip3 show six | grep "Location:" | cut -d " " -f2
Rost
quelle
1

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.

MultipleMonomials
quelle
-2

Wenn es bereits zum hinzugefügt wurde, PYTHONPATHkönnen Sie auch so etwas tun

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