Come trovo la posizione della mia directory dei pacchetti di siti Python?


Risposte:


534

Esistono due tipi di directory dei pacchetti del sito, globale e per utente .

  1. Le directory dei pacchetti di siti globali (" dist-pacchetti ") sono elencate sys.pathquando si esegue:

    python -m site

    Per un elenco più conciso eseguito getsitepackagesdal modulo del sito nel codice Python:

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

    Nota: con virtualenvs getsitepackages non è disponibile , sys.pathdall'alto verrà comunque elencata correttamente la directory dei pacchetti del sito di virtualenv. In Python 3, puoi invece usare il modulo sysconfig :

    python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])'
  2. La directory dei pacchetti del sito per utente ( PEP 370 ) è dove Python installa i pacchetti locali:

    python -m site --user-site

    Se questo punta a una directory inesistente, controlla lo stato di uscita di Python e consulta le python -m site --helpspiegazioni.

    Suggerimento: in esecuzione pip list --usero pip freeze --userfornisce un elenco di tutti i pacchetti di siti installati per utente .


Suggerimenti pratici

  • <package>.__path__ti consente di identificare la / e posizione / i di un pacchetto specifico: ( dettagli )

    $ python -c "import setuptools as _; print(_.__path__)"
    ['/usr/lib/python2.7/dist-packages/setuptools']
    
  • <module>.__file__consente di identificare la posizione di un modulo specifico: ( differenza )

    $ python3 -c "import os as _; print(_.__file__)"
    /usr/lib/python3.6/os.py
    
  • Esegui pip show <package>per mostrare le informazioni sul pacchetto in stile Debian:

    $ 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
    

17
c'è una directory del pacchetto del sito in un virtualenv. Puoi ottenere la directory per i moduli specifici del sito dentro / fuori virtualenv usando python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"(funziona anche su Python 2 e 3).
jfs,

4
Bello. E per ottenere il primo:python -c "import site; print(site.getsitepackages()[0])"
Brent Faust

2
Questo dovrebbe essere in qualsiasi tutorial di base sull'uso di Python. Pythoning da anni e non conoscevo il modulo del sito. Avrebbe risparmiato così tanti mal di testa ...
Salotz,

1
Ho suggerito una modifica al tutorial ufficiale di Python. Per i dettagli vedere PR # 16974 e grazie per il suggerimento @salotz!
Peterino,

1
Penso che stackoverflow.com/a/52638888/1365918 sia facilmente la migliore risposta a questa domanda.
Kapad,

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

(o solo il primo elemento con site.getsitepackages()[0])


17
Questo è buono ma, sfortunatamente, questa funzione è disponibile solo da python2.7. Quindi, bella soluzione se stai usando python2.7 o versioni successive, ma non lavori per python 2.6 e versioni precedenti
Dan Niero

15
python -c "import site; print (site.getsitepackages ())"
Lars Schneider,

29
Ottengo AttributeError: l'oggetto 'module' non ha alcun attributo 'getsitepackages' quando si usa con virtualenv (python 2.7.8), tuttavia la soluzione distutils funziona.
Radtek,

8
@radtek: per venv, rilevo venv via hasattr(sys,'real_prefix')e quindi determino euristicamente i pacchetti del sito [p for p in sys.path if p.endswith('site-packages')][-1](oltre a controllare se ne è stato trovato uno prima di fare il [-1].
eudoxos

4
@radtek È un bug noto che il modulo del sito non funziona per virtualenv github.com/pypa/virtualenv/issues/355
Guillem Cucurull

319

Una soluzione che:

  • al di fuori di virtualenv: fornisce il percorso di pacchetti di siti globali ,
  • insidue a virtualenv: fornisce i pacchetti del sito di virtualenv

... è questo one-liner:

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

Formattato per essere leggibile (piuttosto che usarlo come una riga), è simile al seguente:

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


Fonte: una versione molto vecchia della documentazione "Come installare Django" (sebbene ciò sia utile a qualcosa di più della semplice installazione di Django)


1
Virtualenv fornisce un modo per trovare i pacchetti del sito?
Daryl Spitzer,

10
È possibile utilizzare virtualenvwrapper, che ha il comando cdsitepackages, per passare direttamente alla directory dei pacchetti del sito dell'ambiente.
john2x,

6
@PiotrDobrogost: funziona per me su Python 2.7 in un virtualenv su Linux
RichVel

2
Il primo commento non si applica più: questo ha mostrato la posizione corretta sia all'esterno che all'interno di virtualenv.
astrojuanlu,

2
Non ha funzionato per me su Windows 10 usando Linux bash, restituisce /usr/lib/python3/dist-packagesinvece di /usr/lib/python3.5/dist-packages.
Delgan,

99

Per Ubuntu ,

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

...non è corretto.

Ti indicherà /usr/lib/pythonX.X/dist-packages

Questa cartella contiene solo pacchetti che il tuo sistema operativo ha installato automaticamente per l'esecuzione dei programmi.

Su ubuntu , si troverà la cartella dei pacchetti del sito che contiene i pacchetti installati tramite setup_tools \ easy_install \ pip/usr/local/lib/pythonX.X/dist-packages

La seconda cartella è probabilmente la più utile se il caso d'uso è correlato all'installazione o alla lettura del codice sorgente.

Se non usi Ubuntu, probabilmente stai sicuro incollando la prima casella di codice nel terminale.


3
Se il richiedente è dopo la posizione di un determinato pacchetto, module.__file__è il modo migliore. Se stanno cercando di installare cose ... basta usare gli strumenti.
Tobu,

'/usr/lib/pythonX.X/dist-packages' in site.getsitepackages()su Ubuntu (anche se va dopo /usr/local/... nella lista). Ottieni solo qualcosa in /usr/localvia sudo pipe non dovresti usare sudo pipsu Ubuntu a meno che tu non abbia deciso di creare la tua distribuzione: se lo usi sudo pip, è tua responsabilità assicurarti che tutte le dipendenze dei moduli python attuali e futuri installati tramite sudo apto sudo pipsiano compatibili. Considera quale problema è virtualenvstato creato per risolvere
jfs il

Spiegazione chiara per comprendere le differenze tra 2 dist-packagesin (L) Ubuntu.
Timo,

69

Questo è ciò che ha funzionato per me:

python -m site --user-site

15
Per me questo indica una cartella che non esiste nemmeno ( ~/.local/lib/python2.7/site-packages).
Neil Traft,

1
lo stesso, in OS X Mavericks, la mia casa .local non è ciò che volevo che trovasse e sì, non è comunque lì.
Radtek,

È nella mia cartella principale / Libreria che dovevo navigare manualmente, per qualche ragione il percorso completo diretto non funzionava
efwjames

come posso usare i pacchetti installati qui? se lo faccio virtualenvsi lamenta che il pacchetto non esiste. come invoco i pacchetti installati in una posizione personalizzata?
Circa

2
Questo ti dice dove Python cercherà i pacchetti specifici dell'utente. Commenti come "non esiste nemmeno" e "non è quello che volevo che trovasse" non ha senso in questo contesto.
Onesto Abe

28

Supponiamo che tu abbia installato il pacchetto 'django'. importalo e digita dir (django). Ti mostrerà tutte le funzioni e gli attributi con quel modulo. Digita l'interprete Python -

>>> import django
>>> dir(django)
['VERSION', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'get_version']
>>> print django.__path__
['/Library/Python/2.6/site-packages/django']

Puoi fare la stessa cosa se hai installato mercurial.

Questo è per Snow Leopard. Ma penso che dovrebbe funzionare anche in generale.


>>> import pg >>> print pg .__ path__ Traceback (ultima chiamata più recente): File "<stdin>", riga 1, in <module> AttributeError: l'oggetto 'module' non ha attributi ' path '
Dannid

funziona, devo trovare il pacchetto sklearn da aggiungere al percorso PYDEV, grazie.
Berkay,

usare django.__file__per questo piuttosto che __path__. e, no, non è una garanzia che questo abbia qualcosa a che fare con i pacchetti del sito, ma con cose come django, che molto probabilmente hai installato pip , lo farà quando sei di fretta e può essere usato per anche altri scopi (ad esempio la lettura di un file di configurazione predefinito dal file system).
JL Peyret,

Sulla base di questa e di altre risposte puoi farlo in una riga dalla riga di comando per ottenere il percorso per il tuo foo.barpacchetto:python -c "import foo.bar as _; print(_.__path__[0])"
snark

23

Come altri hanno notato, distutils.sysconfigha le impostazioni pertinenti:

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

... sebbene il valore predefinito site.pyfaccia qualcosa di un po 'più grezzo, parafrasato di seguito:

import sys, os
print os.sep.join([sys.prefix, 'lib', 'python' + sys.version[:3], 'site-packages'])

(aggiunge ${sys.prefix}/lib/site-pythone aggiunge anche entrambi i percorsi sys.exec_prefix, se quella costante dovesse essere diversa).

Detto questo, qual è il contesto? Non dovresti fare casini con il tuo site-packagesdirettamente; setuptools / distutils funzionerà per l'installazione e il tuo programma potrebbe essere in esecuzione in un virtual virtual in cui il tuo pythonpath è completamente local-user, quindi non dovrebbe nemmeno assumere direttamente l'uso dei pacchetti del sito di sistema.


3
funziona in modo affidabile con python2su osx e ubuntu con e senza virtualenv ma non con python3affatto.
jitter,

2
Il 2008 era un po 'indietro: questa risposta era tre mesi prima dell'uscita di Python 3.0.
Charles Duffy,

certo, ma oggi il mio commento potrebbe essere d'aiuto. correggimi se sbaglio. inoltre, non ho votato a favore di questa risposta o di qualsiasi altra cosa python3.
jitter,

22

Un moderno modo standard è l'utilizzo del sysconfigmodulo, disponibile nelle versioni 2.7 e 3.2+.

Nota : sysconfig( sorgente ) non deve essere confuso con il distutils.sysconfigsottomodulo ( fonte ) menzionato in molte altre risposte qui. Quest'ultimo è un modulo completamente diverso e manca della get_pathsfunzione discussa di seguito.

Python attualmente utilizza otto percorsi ( documenti ):

  • stdlib : directory contenente i file di libreria Python standard che non sono specifici della piattaforma.
  • platstdlib : directory contenente i file di libreria Python standard specifici della piattaforma.
  • platlib : directory per file specifici del sito, specifici della piattaforma.
  • purelib : directory per file specifici del sito, non specifici della piattaforma.
  • include : directory per file header non specifici della piattaforma.
  • platinclude : directory per file header specifici della piattaforma.
  • script : directory per i file di script.
  • dati : directory per i file di dati.

Nella maggior parte dei casi, gli utenti che trovano questa domanda sarebbero interessati al percorso "purelib" (in alcuni casi , potresti essere interessato anche a "platlib"). A differenza della risposta attualmente accettata, questo metodo funziona ancora indipendentemente dal fatto che tu abbia o meno attivato virtualenv.

A livello di sistema (questo è Python 3.7.0 su 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'

Con un venv otterrai qualcosa del genere

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

È inoltre disponibile uno script shell per visualizzare questi dettagli, che è possibile richiamare eseguendo sysconfigcome modulo:

python -m sysconfig

Questa è un'ottima risposta, sono felice che il nuovo modulo sysconfig lo renda più facile. C'è un modo per ottenere il prefisso locale platlib, come ad esempio /usr/local/lib/python3.6/site-packages? Tradizionalmente, le cose installate localmente dovrebbero entrare /usr/local.
eudoxos,

Facilmente la migliore risposta a questa domanda! Grazie. L'unica cosa che ho trovato mancante era l'ordinamento in cui vengono verificate queste posizioni quando viene rilevata una dichiarazione di importazione. Inoltre, c'è una di queste posizioni pre-ricercate / memorizzate nella cache quando viene caricato Python? Sapendo che sarebbe utile anche l'IMO.
Kapad,

21

I pacchetti di sistema nativi installati con l'installazione di Python nei sistemi basati su Debian sono disponibili su:

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

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

usando questo piccolo codice:

from distutils.sysconfig import get_python_lib
print get_python_lib()

Tuttavia, l'elenco dei pacchetti installati tramite pipè disponibile all'indirizzo:

/ Usr / local / bin /

Oppure si può semplicemente scrivere il seguente comando per elencare tutti i percorsi in cui si trovano i pacchetti python.

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

Nota: la posizione potrebbe variare in base al sistema operativo in uso, come 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']

Se ricordo bene, dist-pacchetti è specifico di Debian e dei derivati.
Samuel,

1
@SamuelSantana hai ragione. i pacchetti dist sono specifici per i sistemi basati su debian. In questo caso ho invocato site.getsitepackages()dall'installazione del sistema, quindi i pacchetti dist, altre installazioni mostreranno i pacchetti del sito.
fnatic_shank,

15

Tutte le risposte (o: la stessa risposta ripetuta più e più volte) sono inadeguate. Quello che vuoi fare è questo:

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

La riga finale mostra la directory di installazione. Funziona su Ubuntu, mentre quelli sopra non lo fanno. Non chiedermi informazioni su Windows o altre dist, ma poiché è esattamente la stessa directory utilizzata da easy_install per impostazione predefinita, probabilmente è corretta ovunque dove easy_install funzioni (quindi, ovunque, anche sui Mac). Divertiti. Nota: il codice originale contiene molte parolacce.


1
Grazie, questo è abbastanza utile, su py3 con parentesi per la stampa mi prende /usr/local/lib/python3.4/dist-packages Sto cercando di capire come ottenere /usr/lib/python3.4/dist -pacchetti quindi dovranno giocare ulteriormente.
Stuart Axon,

4
richiede una libreria esterna easy_installe non fallisce con grazia se non disponibile, il che è inadeguato :)
jitter

1
in effetti, questo non è perfetto, ma ha funzionato per me e ci è voluto molto tempo per capirlo, quindi l'ho messo qui nella speranza che qualcun altro possa sfruttare il tempo che ci ho già dedicato.
imbroglione

13

Una nota a margine: la soluzione proposta ( distutils.sysconfig.get_python_lib()) non funziona quando esiste più di una directory di pacchetti del sito (come raccomandato da questo articolo ). Restituirà solo la directory principale dei pacchetti del sito.

Purtroppo, non ho nemmeno una soluzione migliore. Python non sembra tenere traccia delle directory dei pacchetti del sito, ma solo dei pacchetti al loro interno.


1
Immagino sia questo il motivo per cui, get_python_lib()quando eseguito da virtualenv, mostra i pacchetti di siti di Python usati per creare virtualenv e non i pacchetti di siti di virtualenv .
Piotr Dobrogost,

3
@Piotr Quello era probabilmente un bug in distutils.sysconfig. L'ho appena provato e ottengo i pacchetti del sito interno, come previsto.
Tobu,

Testato anche con Python 2.7 installato in virtualenv su Linux, e il metodo distutils.sysconfig funziona bene per ottenere i pacchetti di siti interni di Python.
RichVel

12

Questo funziona per me. Verranno visualizzate sia le cartelle dist-pacchetti che quelle dei siti. Se la cartella non si trova sul percorso di Python, non ti farà comunque molto bene.

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

Output (installazione di Ubuntu):

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

2
la risposta accettata è il modo consigliato, quindi dovresti dire perché la tua è migliore, dal momento che è un po 'un trucco
CharlesB

Cosa c'è che non va in un hack? ;) È più semplice e facile da capire e ricordare se stai lavorando in modo interattivo.
just_an_old_guy

11

Questo dovrebbe funzionare su tutte le distribuzioni dentro e fuori l'ambiente virtuale a causa della sua natura "a bassa tecnologia". Il modulo os risiede sempre nella directory principale di "site-pacchetti"

import os; print(os.path.dirname(os.__file__) + '/site-packages')

Per cambiare la directory con la directory dei pacchetti del sito, uso il seguente alias (su sistemi * nix):

alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'

10

Una nota aggiuntiva alla get_python_libfunzione già menzionata: su alcune piattaforme vengono utilizzate diverse directory per moduli specifici della piattaforma (ad esempio: moduli che richiedono la compilazione). Se passi plat_specific=Truealla funzione ottieni i pacchetti del sito per pacchetti specifici della piattaforma.




3

Risposta alla vecchia domanda. Ma usa ipython per questo.

pip install ipython
ipython 
import imaplib
imaplib?

Questo darà il seguente output sul pacchetto imaplib -

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

1
Questa non è la directory dei pacchetti del sito, ma la directory in cui è installato il pacchetto. Questo è utile anche se stai usando iPython e non per essere in grado di ottenere a livello di codice una directory di installazione.
danielunderwood,

3

Dovresti provare questo comando per determinare la posizione di installazione di pip

Python 2

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

Python 3

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

1

Ho dovuto fare qualcosa di leggermente diverso per un progetto su cui stavo lavorando: trovare la relativa directory dei pacchetti del sito relativa al prefisso di installazione di base. Se la cartella dei pacchetti del sito era in /usr/lib/python2.7/site-packages, volevo la /lib/python2.7/site-packagesparte. In effetti, ho incontrato sistemi in cui si site-packagestrovava/usr/lib64 e la risposta accettata NON ha funzionato su tali sistemi.

Simile alla risposta di Cheater, la mia soluzione fa capolino nelle viscere di Distutils, per trovare il percorso che effettivamente passa all'interno setup.py. È stato un tale dolore capire che non voglio che nessuno debba mai capirlo di nuovo.

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', ''))

Questo dovrebbe stampare qualcosa di simile /Lib/site-packageso /lib/python3.6/site-packages.


-2

Se è già stato aggiunto a PYTHONPATHpuoi anche fare qualcosa di simile

import sys
print('\n'.join(sys.path))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.