wake-up-neo.com

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

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

752
Daryl Spitzer

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

  1. Global Site-Packages-Verzeichnisse (" dist-packages ") werden beim Ausführen in sys.path aufgelistet:

    python -m site
    

    Für eine genauere Liste führen Sie getsitepackages aus dem Modul site in Python-Code aus:

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

    Hinweis: Mit virtualenvs getsitepackages ist nicht verfügbar , sys.path von oben listet das site-packages-Verzeichnis von virtualenv jedoch korrekt auf.

  2. Im Verzeichnis per user site-packages ( PEP 370 ) werden die lokalen Pakete von Python installiert:

    python -m site --user-site
    

    Wenn dies auf ein nicht vorhandenes Verzeichnis verweist, überprüfen Sie den Exit-Status von Python und finden Sie unter python -m site --help Erklärungen.

    Hinweis: Durch Ausführen von pip list --user oder pip freeze --user erhalten Sie eine Liste aller installierten pro Benutzer Site-Packages.


Praktische Tipps

  • Mit <package>.__path__ können Sie die Standorte eines bestimmten Pakets identifizieren: ( Details )

    $ python -c "import setuptools as _; print(_.__path__)"
    ['/usr/lib/python2.7/dist-packages/setuptools']
    
  • Mit <module>.__file__ können Sie den Speicherort eines bestimmten Moduls ermitteln: ( difference )

    $ python3 -c "import os as _; print(_.__file__)"
    /usr/lib/python3.6/os.py
    
  • Führen Sie pip show <package> aus, um die 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
    
256
Peterino
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

(oder nur der erste Artikel mit site.getsitepackages()[0])

627
eudoxos

Von "How to Django installieren" Dokumentation (obwohl dies mehr als nur die Installation von Django ist) - führen Sie Folgendes aus der Shell aus:

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

Der besseren Lesbarkeit halber (anstatt als Einzeiler zu verwenden), sieht das wie folgt aus:

from distutils.sysconfig import get_python_lib
print(get_python_lib())
301
Daryl Spitzer

Für Ubuntu ,

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

...das ist nicht richtig.

Es wird auf /usr/lib/pythonX.X/dist-packages verweisen

Dieser Ordner enthält nur Pakete, die Ihr Betriebssystem automatisch installiert hat, damit Programme ausgeführt werden können.

Unter ubuntu befindet sich der Site-Packages-Ordner, der Pakete enthält, die über setup_tools\easy_install\pip installiert wurden, in /usr/local/lib/pythonX.X/dist-packages.

Der zweite Ordner ist wahrscheinlich der nützlichere, wenn sich der Anwendungsfall auf die Installation oder das Lesen von Quellcode bezieht.

Wenn Sie Ubuntu nicht verwenden, ist es wahrscheinlich, dass Sie das erste Code-Feld sicher in das Terminal kopieren.

98
David Hollander

Das hat bei mir funktioniert:

python -m site --user-site
64
Ramashri

Nehmen wir an, 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 Snow Leopard. Aber ich denke, es sollte auch allgemein funktionieren.

22
Sumod

Wie bereits erwähnt, hat distutils.sysconfig die entsprechenden Einstellungen:

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

... obwohl die Standardeinstellung site.py etwas grob wirkt und im Folgenden umschrieben wird:

import sys, os
print os.sep.join([sys.prefix, 'lib', 'python' + sys.version[:3], 'site-packages'])

(es fügt auch ${sys.prefix}/lib/site-python und beide Pfade für sys.exec_prefix hinzu, falls diese Konstante unterschiedlich ist).

Das heißt, was ist der Kontext? Sie sollten sich nicht direkt mit Ihrem site-packages beschäftigen; setuptools/distutils kann für die Installation verwendet werden. Möglicherweise wird Ihr Programm in einer virtuellen Umgebung ausgeführt, in der Ihr Pythonpfad vollständig benutzerlokal ist. Daher sollte die Verwendung der System-Site-Pakete nicht direkt vorausgesetzt werden.

21
Charles Duffy

Die systemeigenen Systempakete, die mit der Python-Installation in Debian-basierten Systemen installiert werden, 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 pip installierten Pakete finden Sie jedoch unter:

/ usr/local/bin /

Oder Sie schreiben einfach den folgenden Befehl, 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 unterschiedlich sein, z. B. unter 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']
15
fnatic_shank

Alle Antworten (oder die gleiche Antwort, die immer wieder wiederholt wird) sind unzureichend. Was Sie wollen, 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 das Installationsverzeichnis. Funktioniert auf Ubuntu, die oben genannten jedoch nicht. Fragen Sie mich nicht nach Fenstern 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 ursprüngliche Code enthält viele Schimpfwörter.

13
cheater

Eine Randnotiz: Die vorgeschlagene Lösung (distutils.sysconfig.get_python_lib()) funktioniert nicht, wenn mehrere Site-Packages-Verzeichnisse vorhanden sind (als empfohlen in diesem Artikel ). Es wird nur das Hauptverzeichnis der Site-Packages zurückgegeben.

Leider habe ich auch keine bessere Lösung. Python scheint nicht die Verzeichnisse der Site-Pakete zu verfolgen, sondern nur die darin enthaltenen Pakete.

11
user147100

Dies funktioniert für mich . Damit erhalten Sie sowohl dist-packages- als auch site-packages-Ordner . Wenn sich der Ordner nicht im Pfad von Python befindet, ist es ___.

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

Ein zusätzlicher Hinweis zu der bereits erwähnten get_python_lib-Funktion: Auf einigen Plattformen werden unterschiedliche Verzeichnisse für plattformspezifische Module verwendet (z. B. Module, die übersetzt werden müssen). Wenn Sie plat_specific=True an die Funktion übergeben, erhalten Sie die Site-Pakete für plattformspezifische Pakete.

8
Armin Ronacher

Dies sollte auf allen Distributionen innerhalb und außerhalb der virtuellen Umgebung funktionieren, da es sich dabei um "Low-Tech" -Art handelt. Das os-Modul befindet sich immer im übergeordneten Verzeichnis von 'site-packages'.

import os; print(os.path.dirname(os.__file__) + '/site-packages')

Um das Verzeichnis in das Site-Paket 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'
8
Pyramid Newbie
from distutils.sysconfig import get_python_lib
print get_python_lib()
7
Florian Bösch

pip show enthält alle Details zu einem Paket: https://pip.pypa.io/de/stable/reference/pip_show/ [pip show] [1]

Um den Ort zu bekommen:

pip show <package_name>| grep Location
3
Sourabh Potnis

Eine moderne stdlib-Methode verwendet das sysconfig -Modul, das in Version 2.7 und 3.2+ verfügbar ist. Python verwendet derzeit acht Pfade ( docs ):

  • stdlib: Verzeichnis mit den standardmäßigen Python-Bibliotheksdateien, die nicht plattformspezifisch sind.
  • platstdlib: Verzeichnis, das die standardmäßigen Python-Bibliotheksdateien enthält, die plattformspezifisch sind.
  • platlib: Verzeichnis für standortspezifische, plattformspezifische Dateien.
  • purelib: Verzeichnis für standortspezifische, nicht plattformspezifische Dateien.
  • include: Verzeichnis für nicht plattformspezifische Header-Dateien.
  • platinclude: Verzeichnis für plattformspezifische Header-Dateien.
  • scripts: Verzeichnis für Skriptdateien.
  • Daten: Verzeichnis für Datendateien.

In den meisten Fällen interessieren sich Benutzer für diese Frage für den "Purelib" -Pfad (in einigen Fällen könnten Sie auch an "platlib" interessiert sein). Im Gegensatz zu der aktuell akzeptierten Antwort sollte sich diese Methode nicht verhalten, je nachdem, ob Sie eine virtualenv 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 erhalten Sie 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 von sysconfig als Modul aufrufen können:

python -m sysconfig

Hinweis:sysconfig ( source ) ist nicht mit dem distutils.sysconfig-Submodul ( source ) zu verwechseln, das in mehreren anderen Antworten erwähnt wird. Dies ist ein völlig anderes Modul und es fehlt die oben diskutierte get_paths-Funktion.

3
wim

Antwort auf alte Frage Verwenden Sie dafür aber 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
2
Sahil Agarwal

Ich musste für ein Projekt, an dem ich arbeitete, etwas anders machen: Finde das Verzeichnis relative site-packages relativ zum Basisinstallationspräfix. Wenn sich der Site-Packages-Ordner in /usr/lib/python2.7/site-packages befand, wollte ich den /lib/python2.7/site-packages-Teil. Ich habe tatsächlich Systeme angetroffen, bei denen site-packages in /usr/lib64 war, und die akzeptierte Antwort funktionierte auf diesen Systemen NICHT. 

Ähnlich wie die Antwort des Betrügers späht meine Lösung tief in die Eingeweide von Distutils, um den Pfad zu finden, der in setup.py tatsächlich weitergegeben wird. Es war so schmerzlich, herauszufinden, dass niemand möchte, dass dies jemals wieder herausgefunden werden 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 etwas wie /Lib/site-packages oder /lib/python3.6/site-packages drucken.

0

Wenn es bereits zur PYTHONPATH hinzugefügt wurde, können Sie auch etwas tun

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

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
0
rust