Pip sovrascrive i pacchetti installati da apt-get?


9

Cosa succede se accidentalmente pip installun pacchetto che ho già installato in apt-getprecedenza? Devo semplicemente usare l'ultima versione (cioè probabilmente quella che ho installato usando pip)? Cosa succede al contrario?

Nota: non utilizzo Python in un ambiente virtuale (semplicemente perché non so perché dovrei: utilizzo Python come strumento di analisi dei dati e provo principalmente a utilizzare l'ultima versione di tutto).


Se non sbaglio, non installi gli stessi pacchetti usando apt-getepip
Lucio,

Corerct, pipli installa nella /usr/localsottodirectory di default o qualsiasi altra directory, se si desidera.
Timo,

3
Ma cosa succede, ad esempio, se prima lo faccio apt-get install python-pandasseguito pip install pandaso viceversa? In che modo la mia installazione globale di Python sa quale delle due versioni utilizzare?
Fred S,

1
@FredS: esegui il seguente comando nel terminale, Python cercherà un modulo nell'ordine specifico:python -c "import sys; print sys.path"
Timo

Risposte:


3

Come @Timo menzionato nel suo commento, python -c "import sys; print sys.path"ti fornirà il percorso di caricamento del modulo Python per la tua installazione di Python. Su un'installazione relativamente nuova di 16.04, ci sono tre directory degne di nota (tra le 10 in totale che erano nella mia):

  • '' (directory dell'applicazione)
  • '/usr/local/lib/python2.7/dist-packages' (dove pip installa i moduli)
  • '/usr/lib/python2.7/dist-packages' (dove apt installa i moduli)

La cosa più importante da notare, tuttavia, è che '/usr/local/lib/python2.7/dist-packages' è SUPERIORE in precedenza rispetto a '/usr/lib/python2.7/dist-packages'.

Se installi per la prima volta un pacchetto Python tramite apt (-get), verrà installato in '/usr/lib/python2.7/dist-packages'. Se in seguito si tenta di utilizzare pip per installare il modulo, pip inizialmente avviserà che la dipendenza è già soddisfatta, quindi esce; l'aggiunta del flag --upgrade imporrà l'installazione di pip, l'installazione del modulo in '/usr/local/lib/python2.7/dist-packages'. (Si noti l'output che dice anche che la versione in '/usr/lib/python2.7/dist-packages' non viene disinstallato) Si può quindi verificare che la versione pip-installata è quella in uso utilizzando la seguente: python -c "import MODULE; print MODULE.__file__".

Di conseguenza, questo dimostra che i pacchetti installati tramite pip avranno la precedenza sui pacchetti installati dal sistema, ma non sovrascriveranno nulla di installato da apt (-get).


1

Per aggiungere a @Bryan Wyatt, sembra desiderabile (e previsto) che gli elementi installati / aggiornati PIP abbiano la precedenza sui pacchetti installati APT (probabilmente più vecchi). Il mio sistema aveva i percorsi apt e pip invertiti. Dovrebbe essere (ignorando altre voci):

  • '/usr/local/lib/python2.7/dist-packages' (dove pip installa i moduli)
  • '/usr/lib/python2.7/dist-packages' (dove apt installa i moduli)

Tuttavia, a causa di alcune azioni sconosciute che devo aver intrapreso, questi percorsi sono apparsi nell'ordine opposto per me (ignorando altre voci):

  • '/usr/lib/python2.7/dist-packages' (dove apt installa i moduli)
  • '/usr/local/lib/python2.7/dist-packages' (dove pip installa i moduli)

Si scopre qualcosa che ho fatto aggiunto /usr/lib/python2.7/dist-packagesa /usr/local/lib/python2.7/dist-packages/easy-install.pth. Semplicemente rimuovendo la linea da easy-install.pthriparato il misordering per me. /usr/lib/python2.7/dist-packagesè ancora sul mio percorso, poiché viene aggiunto in un secondo momento altrove.

Come nota a margine, pprint mostrerà il tuo percorso più bello ... cioè:

$ python -c "import sys; import pprint; pprint.pprint(sys.path)"
['',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-x86_64-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/PILcompat',
 '/usr/lib/python2.7/dist-packages/gtk-2.0',
 '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']
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.