Wie finde ich den Speicherort meines Python-Site-Packages-Verzeichnisses?
-
02-07-2019 - |
Frage
Wie finde ich den Speicherort meines Site-Packages-Verzeichnisses?
Lösung
Es gibt zwei Arten von Website-Pakete Verzeichnisse, global und pro Benutzer .
-
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. -
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
oderpip 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
import sys
print('\n'.join(sys.path))