Hoe vind ik de locatie van mijn Python site-packages directory?

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.

  1. Globalsite-packages (“dist-packages“) mappen worden weergegeven in sys.pathwanneer u het volgende uitvoert:

    python -m site
    

    Voor een beknoptere lijst voert u getsitepackagesuit vanuit de sitemodulein Python-code:

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

    Opmerking:met virtualenvs getsitepackages is niet beschikbaar, sys.pathvan 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"])'
    
  2. 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 --helpvoor uitleg.

    Hint:Als u pip list --userof pip freeze --useruitvoert, 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']
    
  • Met

  • <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
    

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 sysconfigModule, 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_pathsdie 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 sysconfigals module uit te voeren:

python -m sysconfig

Antwoord 8, autoriteit 3%

Zoals anderen al hebben opgemerkt, heeft distutils.sysconfigde relevante instellingen:

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

…hoewel de standaard site.pyiets 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-pythontoe 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-packagesgaan 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 pipis 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=Truedoorgeeft 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-packagesbevond, wilde ik het gedeelte /lib/python2.7/site-packages. Ik ben in feite systemen tegengekomen waar site-packagesin /usr/lib64stond, 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-packagesof /lib/python3.6/site-packagesmoeten 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])

Other episodes