Risposte:
Esistono due tipi di directory dei pacchetti del sito, globale e per utente .
Le directory dei pacchetti di siti globali (" dist-pacchetti ") sono elencate sys.path
quando si esegue:
python -m site
Per un elenco più conciso eseguito getsitepackages
dal modulo del sito nel codice Python:
python -c 'import site; print(site.getsitepackages())'
Nota: con virtualenvs getsitepackages non è disponibile , sys.path
dall'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"])'
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 --help
spiegazioni.
Suggerimento: in esecuzione pip list --user
o pip freeze --user
fornisce un elenco di tutti i pacchetti di siti installati per utente .
<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
python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
(funziona anche su Python 2 e 3).
python -c "import site; print(site.getsitepackages()[0])"
>>> 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]
)
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]
.
Una soluzione che:
... è 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)
cdsitepackages
, per passare direttamente alla directory dei pacchetti del sito dell'ambiente.
/usr/lib/python3/dist-packages
invece di /usr/lib/python3.5/dist-packages
.
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.
module.__file__
è il modo migliore. Se stanno cercando di installare cose ... basta usare gli strumenti.
'/usr/lib/pythonX.X/dist-packages' in site.getsitepackages()
su Ubuntu (anche se va dopo /usr/local/...
nella lista). Ottieni solo qualcosa in /usr/local
via sudo pip
e non dovresti usare sudo pip
su 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 apt
o sudo pip
siano compatibili. Considera quale problema è virtualenv
stato creato per risolvere
dist-packages
in (L) Ubuntu.
Questo è ciò che ha funzionato per me:
python -m site --user-site
~/.local/lib/python2.7/site-packages
).
virtualenv
si lamenta che il pacchetto non esiste. come invoco i pacchetti installati in una posizione personalizzata?
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.
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).
foo.bar
pacchetto:python -c "import foo.bar as _; print(_.__path__[0])"
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 ${sys.prefix}/lib/site-python
e 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-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.
python2
su osx e ubuntu con e senza virtualenv ma non con python3
affatto.
python3
.
Un moderno modo standard è l'utilizzo del sysconfig
modulo, disponibile nelle versioni 2.7 e 3.2+.
Nota : sysconfig
( sorgente ) non deve essere confuso con il distutils.sysconfig
sottomodulo ( fonte ) menzionato in molte altre risposte qui. Quest'ultimo è un modulo completamente diverso e manca della get_paths
funzione 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 sysconfig
come modulo:
python -m sysconfig
platlib
, come ad esempio /usr/local/lib/python3.6/site-packages
? Tradizionalmente, le cose installate localmente dovrebbero entrare /usr/local
.
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']
site.getsitepackages()
dall'installazione del sistema, quindi i pacchetti dist, altre installazioni mostreranno i pacchetti del sito.
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.
easy_install
e non fallisce con grazia se non disponibile, il che è inadeguato :)
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.
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 .
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']
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'
Una nota aggiuntiva alla get_python_lib
funzione 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=True
alla funzione ottieni i pacchetti del sito per pacchetti specifici della piattaforma.
from distutils.sysconfig import get_python_lib
print get_python_lib()
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
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
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-packages
parte. In effetti, ho incontrato sistemi in cui si site-packages
trovava/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-packages
o /lib/python3.6/site-packages
.
pip show <package name>