Antworten:
Es gibt zwei Arten von Site-Paket-Verzeichnissen: global und pro Benutzer .
Globale Site-Packages - Verzeichnisse (" dist-packages ") werden aufgelistet, sys.path
wenn Sie Folgendes ausführen:
python -m site
Für eine übersichtlichere Liste, die getsitepackages
vom Site-Modul in Python-Code ausgeführt wird:
python -c 'import site; print(site.getsitepackages())'
Hinweis: Bei virtualenvs ist getsitepackages nicht verfügbar . sys.path
Von 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 --help
Erklärungen.
Tipp: Wird ausgeführt pip list --user
oder pip freeze --user
gibt 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.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
python -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-packages
stattdessen 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/local
via sudo pip
und sollten es nicht sudo pip
unter 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 apt
oder installiert sudo pip
sind, kompatibel sind. Überlegen Sie, welches Problem virtualenv
zur Lösung erstellt wurde
dist-packages
in (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.bar
Paket zu erhalten:python -c "import foo.bar as _; print(_.__path__[0])"
Wie andere angemerkt haben, distutils.sysconfig
hat die relevanten Einstellungen:
import distutils.sysconfig
print distutils.sysconfig.get_python_lib()
... obwohl die Standardeinstellung site.py
etwas 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-python
beide 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-packages
herumspielen; 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.
python2
auf osx und ubuntu mit und ohne virtualenv aber überhaupt nicht mit python3
.
python3
.
Eine moderne stdlib-Methode ist die Verwendung von sysconfig
Modulen, 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.sysconfig
Submodul ( 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 sysconfig
als 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 pip
finden 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_install
und 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_lib
bereits 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=True
an 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-packages
Teil. Ich bin in der Tat auf Systeme gestoßen, in denen es sich site-packages
befand /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-packages
oder drucken /lib/python3.6/site-packages
.
pip show <package name>