Domanda

Come posso trovare la posizione della mia directory dei pacchetti del sito?

È stato utile?

Soluzione

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

  1. Global site-pacchetti (" dist-pacchetti ") le directory sono elencate in sys.path quando si esegue:

    python -m site
    

    Per un elenco più conciso, eseguire getsitepackages dal modulo del sito nel codice Python:

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

    Nota: con virtualenvs getsitepackages non è disponibile , python -m site --help dall'alto elencherà correttamente la directory dei pacchetti del sito di virtualenv.

  2. La directory per utente site-pacchetti ( PEP 370 ) è dove Python installa i tuoi pacchetti locali:

    python -m site --user-site
    

    Se questo punta a una directory inesistente controlla lo stato di uscita di Python e vedi pip list --user per le spiegazioni.

    Suggerimento: L'esecuzione di pip freeze --user o <package>.__path__ fornisce un elenco di tutti i pacchetti di siti per utente installati


Suggerimenti pratici

  • <module>.__file__ ti consente di identificare la posizione di uno specifico pacchetto: ( dettagli )

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

    $ python3 -c "import os as _; print(_.__file__)"
    /usr/lib/python3.6/os.py
    
  • Esegui <=> 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
    

Altri suggerimenti

>>> 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])

Da " ; Come installare Django & Quot; documentazione (sebbene ciò sia utile a qualcosa di più della semplice installazione di Django) - esegui dalla shell quanto segue:

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())

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 , la cartella dei pacchetti del sito che contiene i pacchetti installati tramite setup_tools \ easy_install \ pip sarà in /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 si utilizza Ubuntu, probabilmente si è sicuri di incollare la prima casella di codice nel terminale.

Questo è ciò che ha funzionato per me:

python -m site --user-site

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.

Come altri hanno notato, distutils.sysconfig ha le impostazioni pertinenti:

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

... sebbene il valore predefinito site.py faccia 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 anche ${sys.prefix}/lib/site-python e aggiunge entrambi i percorsi anche per sys.exec_prefix, se tale costante dovesse essere diversa).

Detto questo, qual è il contesto? Non dovresti fare casini con il tuo site-packages direttamente; 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.

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']

Tutte le risposte (o: la stessa risposta ripetuta 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

L'ultima riga 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.

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.

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 lo sarà farti molto bene comunque.

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']

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

Questo dovrebbe funzionare su tutte le distribuzioni dentro e fuori l'ambiente virtuale a causa del suo " low-tech " natura. 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'
from distutils.sysconfig import get_python_lib
print get_python_lib()

Un moderno metodo standard utilizza il modulo sysconfig , disponibile nella versione 2.7 e 3.2+. Python attualmente utilizza otto percorsi ( docs ):

  
      
  • 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 e specifici della piattaforma.
  •   
  • purelib : directory per file specifici del sito e non specifici della piattaforma.
  •   
  • include : directory per i file di intestazione non specifici della piattaforma.
  •   
  • platinclude : directory per i file di intestazione 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 , tu potrebbe essere interessato anche a "platlib"). A differenza della risposta attualmente accettata, questo metodo non dovrebbe comportarsi in modo errato a seconda che tu abbia attivato o meno un 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 una 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 distutils.sysconfig come modulo:

python -m sysconfig

Nota: get_paths ( source ) non deve essere confuso con il <=> sottomodule ( fonte ) menzionato in molte altre risposte qui. Questo è un modulo completamente diverso e manca la <=> funzione discussa sopra.

pip show fornirà tutti i dettagli su un pacchetto: https://pip.pypa.io/en/stable/reference/pip_show/ [pip show] [1]

Per ottenere la posizione:

pip show <package_name>| grep Location

Rispondi 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

Ho dovuto fare qualcosa di leggermente diverso per un progetto a cui stavo lavorando: trovare la directory relativo 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 parte /lib/python2.7/site-packages. In effetti, ho riscontrato sistemi in cui site-packages era in /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 in realtà viene passato 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', ''))

Che dovrebbe stampare qualcosa come /Lib/site-packages o /lib/python3.6/site-packages.

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

Se è già stato aggiunto a PYTHONPATH puoi anche fare qualcosa come

import sys
print('\n'.join(sys.path))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top