Come trovo la posizione della mia directory dei pacchetti di siti Python?
-
02-07-2019 - |
Domanda
Come posso trovare la posizione della mia directory dei pacchetti del sito?
Soluzione
Esistono due tipi di directory dei pacchetti del sito, globale e per utente .
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.-
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))