Hoe vind ik de locatie van mijn site-packages directory?
Antwoord 1, autoriteit 100%
Er zijn twee soorten directory’s met sitepakketten, algemeenen per gebruiker.
-
Globalsite-packages (“dist-packages“) mappen worden weergegeven in
sys.path
wanneer u het volgende uitvoert:python -m site
Voor een beknoptere lijst voert u
getsitepackages
uit vanuit de sitemodulein Python-code:python -c 'import site; print(site.getsitepackages())'
Opmerking:met virtualenvs getsitepackages is niet beschikbaar,
sys.path
van bovenaf zal echter de site-packages directory van virtualenv correct weergeven. In Python 3 mag je de sysconfig-modulein plaats daarvan:python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])'
-
De per gebruikersite-packages directory (PEP 370) is waar Python je lokale pakketten installeert:
python -m site --user-site
Als dit verwijst naar een niet-bestaande map, controleer dan de exit-status van Python en zie
python -m site --help
voor uitleg.Hint:Als u
pip list --user
ofpip freeze --user
uitvoert, krijgt u een lijst van alle geïnstalleerde per gebruiker site-pakketten.
Praktische tips
-
<package>.__path__
laat je de locatie(s) van een specifiek pakket identificeren: (details)$ python -c "import setuptools as _; print(_.__path__)" ['/usr/lib/python2.7/dist-packages/setuptools']
-
<module>.__file__
kunt u de locatie van een specifieke module identificeren: (verschil)$ python3 -c "import os as _; print(_.__file__)" /usr/lib/python3.6/os.py
-
Voer
pip show <package>
uit om pakketinformatie in Debian-stijl weer te geven:$ 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
Met
Antwoord 2, autoriteit 89%
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
(of gewoon het eerste item met site.getsitepackages()[0]
)
Antwoord 3, autoriteit 44%
Een oplossing die:
- buiten virtualenv – biedt het pad van globalesitepakketten,
- insidue a virtualenv – biedt de virtualenv’ssite-pakketten
…is deze oneliner:
python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
Geformatteerd voor leesbaarheid (in plaats van als oneliner te gebruiken), dat er als volgt uitziet:
from distutils.sysconfig import get_python_lib
print(get_python_lib())
Bron:een zeer oude versie van “Hoe Django te installeren” documentatie(hoewel dit nuttig is voor meer dan alleen Django-installatie)
Antwoord 4, autoriteit 13%
Voor Ubuntu,
python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
…is niet correct.
Het zal u verwijzen naar /usr/lib/pythonX.X/dist-packages
Deze map bevat alleen pakketten die uw besturingssysteem automatisch heeft geïnstalleerd zodat programma’s kunnen worden uitgevoerd.
op Ubuntu , de map Site-pakketten die pakketten bevat die worden geïnstalleerd via Setup_Tools \ Easy_Install \ PIP in /usr/local/lib/pythonX.X/dist-packages
De tweede map is waarschijnlijk de nuttiger als het gebruikscase gerelateerd is aan installatie of het lezen van broncode.
Als u Ubuntu niet gebruikt, bent u waarschijnlijk veilig dat het eerste codekastje in de terminal plakte.
Antwoord 5, Autoriteit 9%
Dit is wat voor mij werkte:
python -m site --user-site
Antwoord 6, Autoriteit 4%
Laten we zeggen dat je het pakket ‘django’ hebt geïnstalleerd. Importeer het en typ in Dir (Django). Het toont u, alle functies en kenmerken met die module. Typ de Python-tolk –
>>> import django
>>> dir(django)
['VERSION', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'get_version']
>>> print django.__path__
['/Library/Python/2.6/site-packages/django']
U kunt hetzelfde doen als u Mercurial hebt geïnstalleerd.
Dit is voor sneeuwluipaard. Maar ik denk dat het ook in het algemeen moet werken.
Antwoord 7, Autoriteit 4%
Een moderne STDLIB-manier gebruikt sysconfig
Module, verkrijgbaar in versie 2.7 en 3.2+. In tegenstelling tot het huidige geaccepteerde antwoord werkt deze methode nog steeds ongeacht of u al dan niet een virtuele omgeving actief hebt.
Opmerking: sysconfig
(bron) moet niet worden verward met de submodule distutils.sysconfig
(bron) genoemd in verschillende andere antwoorden hier. De laatste is een geheel andere module en mist de functie get_paths
die hieronder wordt besproken.
Python gebruikt momenteel achtpaden (docs ):
- stdlib: map met de standaard Python-bibliotheekbestanden die niet platformspecifiek zijn.
- platstdlib: map met de standaard Python-bibliotheekbestanden die platformspecifiek zijn.
- platlib: map voor site-specifieke, platform-specifieke bestanden.
- purelib: map voor sitespecifieke, niet-platformspecifieke bestanden.
- opnemen: directory voor niet-platformspecifieke headerbestanden.
- platinclude: map voor platformspecifieke headerbestanden.
- scripts: map voor scriptbestanden.
- data: map voor gegevensbestanden.
In de meeste gevallen zijn gebruikers die deze vraag vinden geïnteresseerd in het pad ‘purelib’ (in in sommige gevallenbent u misschien ook geïnteresseerd in ‘platlib’). Het purelib-pad is waar gewone Python-pakketten worden geïnstalleerd door tools zoals pip
.
Op systeemniveau ziet u zoiets als dit:
# Linux
$ python3 -c "import sysconfig; print(sysconfig.get_path('purelib'))"
/usr/local/lib/python3.8/site-packages
# macOS (brew installed python3.8)
$ python3 -c "import sysconfig; print(sysconfig.get_path('purelib'))"
/usr/local/Cellar/[email protected]/3.8.3/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages
# Windows
C:\> py -c "import sysconfig; print(sysconfig.get_path('purelib'))"
C:\Users\wim\AppData\Local\Programs\Python\Python38\Lib\site-packages
Met een venv krijg je zoiets als dit
# Linux
/tmp/.venv/lib/python3.8/site-packages
# macOS
/private/tmp/.venv/lib/python3.8/site-packages
# Windows
C:\Users\wim\AppData\Local\Temp\.venv\Lib\site-packages
De functie sysconfig.get_paths()
retourneert een dictaat van alle relevante installatiepaden, bijvoorbeeld op Linux:
>>> import sysconfig
>>> sysconfig.get_paths()
{'stdlib': '/usr/local/lib/python3.8',
'platstdlib': '/usr/local/lib/python3.8',
'purelib': '/usr/local/lib/python3.8/site-packages',
'platlib': '/usr/local/lib/python3.8/site-packages',
'include': '/usr/local/include/python3.8',
'platinclude': '/usr/local/include/python3.8',
'scripts': '/usr/local/bin',
'data': '/usr/local'}
Er is ook een shellscript beschikbaar om deze details weer te geven, die u kunt aanroepen door sysconfig
als module uit te voeren:
python -m sysconfig
Antwoord 8, autoriteit 3%
Zoals anderen al hebben opgemerkt, heeft distutils.sysconfig
de relevante instellingen:
import distutils.sysconfig
print distutils.sysconfig.get_python_lib()
…hoewel de standaard site.py
iets grover doet, zoals hieronder geparafraseerd:
import sys, os
print os.sep.join([sys.prefix, 'lib', 'python' + sys.version[:3], 'site-packages'])
(het voegt ook ${sys.prefix}/lib/site-python
toe en voegt ook beide paden toe voor sys.exec_prefix
, mocht die constante anders zijn) .
Dat gezegd hebbende, wat is de context? Je moet niet direct met je site-packages
gaan rommelen; setuptools/distutils zal werken voor installatie, en je programma kan draaien in een virtualenv waar je pythonpath volledig user-local is, dus het zou ook niet rechtstreeks gebruik moeten maken van de systeemsite-pakketten.
Antwoord 9, autoriteit 3%
De native systeempakketten die zijn geïnstalleerd met python-installatie in op Debian gebaseerde systemen zijn te vinden op:
/usr/lib/python2.7/dist-packages/
In OSX – /Library/Python/2.7/site-packages
door deze kleine code te gebruiken:
from distutils.sysconfig import get_python_lib
print get_python_lib()
De lijst met pakketten geïnstalleerd via pip
is echter te vinden op :
/usr/local/bin/
Of je kunt gewoon de volgende opdracht schrijven om alle paden op te sommen waar python-pakketten zich bevinden.
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
Opmerking: de locatie kan variëren op basis van uw besturingssysteem, zoals 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']
Antwoord 10, autoriteit 2%
Alle antwoorden (of: steeds hetzelfde antwoord herhaald) zijn ontoereikend. Wat je wilt doen is dit:
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
De laatste regel toont u de installatiemap. Werkt op Ubuntu, terwijl de bovenstaande dat niet doen. Vraag me niet naar windows of andere dists, maar aangezien het exact dezelfde map is die easy_install standaard gebruikt, is het waarschijnlijk overal waar easy_install werkt correct (dus overal, zelfs macs). Veel plezier. Opmerking: de originele code bevat veel scheldwoorden.
Antwoord 11, autoriteit 2%
Een kanttekening: de voorgestelde oplossing (distutils.sysconfig.get_python_lib()
) werkt niet als er meer dan één map met sitepakketten is (zoals aanbevolen door dit artikel). Het zal alleen de hoofdmap site-packages teruggeven.
Helaas, ik heb ook geen betere oplossing. Python lijkt de directory’s met sitepakketten niet bij te houden, alleen de pakketten erin.
Antwoord 12, autoriteit 2%
pip show geeft alle details over een pakket:
https://pip.pypa.io/en/stable/reference/pip_show/[pipshow][1]
De locatie opvragen:
pip show <package_name>| grep Location
In Linux kun je naar de map site-packages gaan door:
cd $(python -c "import site; print(site.getsitepackages()[0])")
Antwoord 13, autoriteit 2%
Dit werkt voor mij.
Hiermee krijgt u zowel dist-packages als site-packages-mappen.
Als de map niet op het pad van Python staat, is dat ook niet het geval
doet je sowieso veel goeds.
import sys;
print [f for f in sys.path if f.endswith('packages')]
Uitvoer (Ubuntu-installatie):
['/home/username/.local/lib/python2.7/site-packages',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages']
Antwoord 14, autoriteit 2%
Dit zou moeten werken op alle distributies binnen en buiten de virtuele omgeving vanwege het “low-tech” karakter. De os-module bevindt zich altijd in de bovenliggende map van ‘site-packages’
import os; print(os.path.dirname(os.__file__) + '/site-packages')
Om de map te wijzigen in de site-packages dir gebruik ik de volgende alias (op *nix-systemen):
alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'
Antwoord 15
Een aanvullende opmerking bij de reeds genoemde functie get_python_lib
: op sommige platforms worden verschillende mappen gebruikt voor platformspecifieke modules (bijv. modules die compilatie vereisen). Als u plat_specific=True
doorgeeft aan de functie, krijgt u de sitepakketten voor platformspecifieke pakketten.
Antwoord 16
from distutils.sysconfig import get_python_lib
print get_python_lib()
Antwoord 17
Probeer deze opdracht om de installatielocatie van pip te bepalen
Python 2
pip show six | grep "Location:" | cut -d " " -f2
Python 3
pip3 show six | grep "Location:" | cut -d " " -f2
Antwoord 18
Antwoord op oude vraag. Maar gebruik hiervoor ipython.
pip install ipython
ipython
import imaplib
imaplib?
Dit geeft de volgende uitvoer over het imaplib-pakket –
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
Antwoord 19
Voor degenen die poëziegebruiken, kunt u uw virtuele omgevingspad vinden met poetry debug
:
$ poetry debug
Poetry
Version: 1.1.4
Python: 3.8.2
Virtualenv
Python: 3.8.2
Implementation: CPython
Path: /Users/cglacet/.pyenv/versions/3.8.2/envs/my-virtualenv
Valid: True
System
Platform: darwin
OS: posix
Python: /Users/cglacet/.pyenv/versions/3.8.2
Met deze informatie kunt u sitepakketten weergeven:
ls /Users/cglacet/.pyenv/versions/3.8.2/envs/my-virtualenv/lib/python3.8/site-packages/
Antwoord 20
Ik moest iets iets anders doen voor een project waar ik aan werkte: zoek de relatievesite-packages directory relatief ten opzichte van het basisinstallatievoorvoegsel. Als de map site-packages zich in /usr/lib/python2.7/site-packages
bevond, wilde ik het gedeelte /lib/python2.7/site-packages
. Ik ben in feite systemen tegengekomen waar site-packages
in /usr/lib64
stond, en het geaccepteerde antwoord werkte NIET op die systemen.
Vergelijkbaar met het antwoord van cheater, gluurt mijn oplossing diep in het lef van Distutils, om het pad te vinden dat daadwerkelijk wordt doorgegeven binnen setup.py
. Het deed me zo’n pijn om erachter te komen dat ik niet wil dat iemand dit ooit nog moet uitzoeken.
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', ''))
Dat zou iets als /Lib/site-packages
of /lib/python3.6/site-packages
moeten afdrukken.
Antwoord 21
Ik heb een heel eenvoudige functie gemaakt die de klus klaart
import site
def get_site_packages_dir():
return [p for p in site.getsitepackages()
if "site-packages" in p][0]
get_site_packages_dir()
# '/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages'
Als u de resultaten wilt ophalen met de terminal:
python3 -c "import site;print([p for p in site.getsitepackages() if 'site-package' in p][0])"
/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages
Antwoord 22
Iets dat niet is genoemd die volgens mij nuttig is, als u twee versies van Python hebt geïnstalleerd, b.v. Zowel 3.8 en 3.5 Er kunnen twee mappen zijn genaamd Site-Packages op uw machine. In dat geval kunt u de Python-versie opgeven met behulp van het volgende:
py -3.5 -c "import site; print(site.getsitepackages()[1])