Frage

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

War es hilfreich?

Lösung

Es gibt zwei Arten von Website-Pakete Verzeichnisse, global und pro Benutzer .

  1. Globale Website-Pakete ( " dist-Pakete ") Verzeichnisse werden in sys.path aufgeführt, wenn Sie ausführen:

    python -m site
    

    Für eine kurze Liste läuft getsitepackages aus der Website Modul in Python-Code:

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

    Hinweis: Mit virtualenvs getsitepackages nicht verfügbar ist, sys.path von oben wird die Website-Pakete Verzeichnis korrekt ist virtualenv Liste, though.

  2. Das pro Benutzer site-packages-Verzeichnis ( PEP 370 ) ist, wo Python Ihrer lokalen Pakete installiert:

    python -m site --user-site
    

    Wenn dies deutet auf ein nicht vorhandenes Verzeichnis den Exit-Status von Python überprüfen und sehen python -m site --help für Erklärungen.

    . Hinweis: Running pip list --user oder pip freeze --user gibt Ihnen eine Liste aller installierten pro Benutzer Website-Pakete


Praktische Tipps

  • <package>.__path__ können Sie die Position (en) von einem bestimmten Paket identifizieren: ( Details )

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

    $ python3 -c "import os as _; print(_.__file__)"
    /usr/lib/python3.6/os.py
    
  • Ausführen pip show <package> Debian-style-Paket-Informationen zeigen:

    $ 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
    

Andere Tipps

>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

(oder nur erstes Element mit site.getsitepackages()[0])

"So installieren Django“Dokumentation (obwohl dies mehr als nur Django-Installation nützlich ist) - führen Sie die folgenden von der Shell:

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

Formatiert zur besseren Lesbarkeit (statt Verwendung als Einzeiler), die wie folgt aussieht:

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

Für Ubuntu

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

... ist nicht korrekt.

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

Dieser Ordner enthält nur Pakete Ihr Betriebssystem für Programme automatisch installiert ausgeführt werden.

Auf ubuntu , die Website-Pakete Ordner, Pakete installiert über setup_tools enthält \ easy_install \ pip wird in /usr/local/lib/pythonX.X/dist-packages sein

Der zweite Ordner ist wahrscheinlich die nützlichere ein, wenn der Anwendungsfall der Installation verwendet ist oder Quellcode zu lesen.

Wenn Sie nicht Ubuntu verwenden, sind Sie wahrscheinlich sicher kopier Einfügen der erste Code-Box in das Terminal.

Das ist was für mich gearbeitet:

python -m site --user-site

Angenommen, Sie haben das Paket ‚django‘ installiert haben. importieren und gibt in dir (django). Es zeigt Ihnen, alle Funktionen und Attribute mit diesem Modul. Geben Sie in der Python-Interpreter -

>>> 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 das gleiche tun, wenn Sie Mercurial installiert haben.

Dies ist für Snow Leopard. Aber ich denke, es sollte auch im Allgemeinen arbeiten.

Wie andere haben darauf hingewiesen, distutils.sysconfig hat die entsprechenden Einstellungen:

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

... wenn der Standard site.py etwas tut, etwas grob, umschrieben unter:

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 fügt beiden Wege für sys.exec_prefix auch, sollte diese Konstante unterschiedlich sein).

Wie gesagt, was ist der Kontext? Sie sollten nicht direkt mit Ihrer site-packages werden durcheinander; Setuptools / distutils wird für die Installation arbeitet, und das Programm kann in einem virtualenv ausgeführt werden, wo Ihre PYTHONPATH vollständig benutzer lokal sind, so sollte es nicht direkt entweder Nutzung der System-Website-Pakete übernehmen.

Die nativen Systempakete installiert mit Python-Installation in Debian-basierten Systemen zu finden ist:

  

/usr/lib/python2.7/dist-packages /

In OSX - /Library/Python/2.7/site-packages

durch diesen kleinen Code verwendet:

from distutils.sysconfig import get_python_lib
print get_python_lib()

Allerdings ist die Liste der Pakete über pip installiert sind zu finden unter:

  

/ usr / local / bin /

Oder man kann einfach den folgenden Befehl schreibt alle Pfade aufzuzählen, in denen Python-Pakete sind.

>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

Hinweis: Die Lage könnte auf Ihrem Betriebssystem variiert, 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']

Alle Antworten (oder: die gleiche Antwort immer und immer wiederholt) sind unzureichend. Was Sie tun möchten, ist dies:

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 die Installation Richt. Funktioniert auf Ubuntu, während die oben genannten haben dies nicht tun. Fragen Sie mich nicht über Fenster oder andere dists, aber da es genau die gleich dir ist, die als Standard verwendet easy_install, ist es wahrscheinlich richtig überall dort, wo easy_install Werke (so, überall, auch macs). Habe Spaß. . Hinweis: Original-Code viele Schimpfwörter in sich hat

Eine Randbemerkung: Die vorgeschlagene Lösung (distutils.sysconfig.get_python_lib()) funktioniert nicht, wenn es mehr als ein Website-Pakete Verzeichnis (wie von diesem Artikel empfohlen). Es wird nur das Haupt-Website-Pakete Verzeichnis zurück.

Ach, ich habe keine entweder bessere Lösung. Python scheint nicht den Überblick über site-packages Verzeichnisse zu halten, nur die Pakete in sie.

Das funktioniert für mich. Es wird Sie beide dist-Pakete und Website-Pakete Ordner erhalten. Wenn der Ordner nicht auf Python-Pfad ist, wird es nicht sein, tun Sie viel Gutes sowieso.

import sys; 
print [f for f in sys.path if f.endswith('packages')]

Output (Ubuntu-Installation):

['/home/username/.local/lib/python2.7/site-packages',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages']

Ein zusätzlicher Hinweis auf die get_python_lib Funktion bereits erwähnt: auf einigen Plattformen verschiedene Verzeichnisse verwendet werden, für plattformspezifische Module (zB: Module, die Kompilierung benötigen). Wenn Sie plat_specific=True an die Funktion übergeben Sie die Website-Pakete für bestimmte Pakete Plattform erhalten.

Dies sollte aufgrund seiner „Low-Tech“-Natur auf allen Distributionen innerhalb und außerhalb einer virtuellen Umgebung funktionieren.Das Betriebssystemmodul 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-Packages-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'
from distutils.sysconfig import get_python_lib
print get_python_lib()

Ein moderner stdlib Weg ist mit sysconfig Modul in der Version 2.7 und 3.2+. Python verwendet derzeit acht Pfade ( docs ):

  
      
  • stdlib . Verzeichnis der Standard-Python-Bibliothek-Dateien enthält, die nicht plattformspezifisch sind
  •   
  • platstdlib . Verzeichnis der Standard-Python-Bibliothek-Dateien enthält, die plattformspezifisch sind
  •   
  • platlib . Verzeichnis für die ortsspezifische, plattformspezifische Dateien
  •   
  • purelib . Verzeichnis für die ortsspezifische, nicht-plattformspezifische Dateien
  •   
  • ist . Verzeichnis für nicht-plattformspezifischen Header-Dateien
  •   
  • platinclude . Verzeichnis für plattformspezifische Header-Dateien
  •   
  • Skripte . Verzeichnis für Skriptdateien
  •   
  • Daten . Verzeichnis für Datendateien
  •   

In den meisten Fällen Benutzer diese Frage zu finden, wäre daran interessiert, die ‚purelib‘ Pfad (in href="https://stackoverflow.com/a/122387/674039">, Sie möglicherweise zu dem Interesse ‚platlib‘). Im Gegensatz zu der derzeit akzeptierten Antwort, sollte diese Methode schlecht benehmen nicht abhängig davon, ob oder nicht, Sie haben eine virtualenv aktiviert.

Auf der Systemebene (dies ist Python 3.7.0 auf 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, werden Sie so etwas wie dieses erhalten

>>> import sysconfig                                                                                                                                                
>>> sysconfig.get_paths()['purelib']                                                                                                                                
'/private/tmp/.venv/lib/python3.7/site-packages'

Ein Shell-Skript ist auch diese Informationen anzuzeigen, die Sie durch das Ausführen sysconfig als Modul aufrufen können:

python -m sysconfig

Hinweis: sysconfig ( Quelle ) mit dem distutils.sysconfig Submodul ( Quelle ) hier in einigen anderen Antworten erwähnt. Das ist ein ganz anderes Modul und es fehlt die get_paths Funktion oben diskutiert wird.

pip Show gibt alle Details über ein Paket: https://pip.pypa.io/en/stable/reference/pip_show/ [pip Show] [1]

, um die Lage zu bekommen:

pip show <package_name>| grep Location

Antwort auf alte Frage. Aber verwenden ipython dafür.

pip install ipython
ipython 
import imaplib
imaplib?

Dies wird die folgende Ausgabe über imaplib Paket geben -

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

hatte ich etwas etwas anders für ein Projekt zu tun, ich arbeite an: Finden Sie die relativ site-packages Verzeichnis relativ zur Basis installiert Präfix. Wenn die Site-Pakete Ordner in /usr/lib/python2.7/site-packages war, wollte ich das /lib/python2.7/site-packages Teil. Ich habe in der Tat begegnet Systeme, bei denen site-packages in /usr/lib64 war, und die akzeptierte Antwort auf diesen Systemen nicht funktioniert hat.

Ähnlich wie cheater Antwort, meine Lösung späht tief in den Eingeweiden von Distutils, den Weg zu finden, die in setup.py wird tatsächlich herumgereicht. Es war so ein Schmerz, um herauszufinden, dass ich nicht jemand dies tun möchte noch einmal überhaupt haben, um herauszufinden.

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-packages oder /lib/python3.6/site-packages drucken.

Sie sollten diesen Befehl versuchen zu bestimmen, Standort pip install

Python 2

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

Python 3

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

Wenn es bereits zum PYTHONPATH hinzugefügt wird man auch so etwas wie

tun kann
import sys
print('\n'.join(sys.path))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top