Ubuntu + virtualenv = un casino? virtualenv odia dist-pacchetti, vuole siti-pacchetti
-
06-07-2019 - |
Domanda
Qualcuno può spiegarmi cosa sta succedendo con Python in Ubuntu 9.04?
Sto cercando di far girare virtualenv
, e il flag --no-site-pacchetti
sembra non fare nulla con Ubuntu. Ho installato virtualenv 1.3.3
con easy_install
(che ho aggiornato a setuptools 0.6c9
) e tutto sembra essere installato su /usr/local/lib/python2.6/dist-packages
I presumo che durante l'installazione di un pacchetto usando apt-get, sia collocato in /usr/lib/python2.6/dist-packages/
?
Il problema è che esiste un /usr/local/lib/python2.6/site-packages
che rimane vuoto. Sembrerebbe (guardando il percorso
in un virtualenv
) che questa è la cartella che virtualenv usa come backup. Quindi anche se ho omesso --no-site-pacchetti
, non posso accedere ai miei pacchetti di sistemi locali da nessuno dei miei virtualenv.
Quindi le mie domande sono:
- Come posso ottenere
virtualenv
per puntare a uno deidist-pacchetti
? - A quali dist-pacchetti devo puntare?
/usr/lib/python2.6/dist-packages
o/usr/local/lib/python2.6/dist-packages/
- Qual è il punto di
/usr/lib/python2.6/site-packages
? Non c'è niente lì dentro! - È il primo arrivato, primo servito sul percorso? Se ho una versione più recente del pacchetto XYZ installata in
/usr/local/lib/python2.6/dist-packages/
e una precedente (da Ubuntu Repos / apt-get) in/usr/lib/python2.6/dist-packages
, quale viene importato quandoimporta xyz
? Suppongo che questo sia basato sull'elenco dei percorsi, sì? - Perché diavolo è così confuso? C'è qualcosa che mi manca qui?
- Dove si definisce che
easy_install
dovrebbe essere installato su/usr/local/lib/python2.6/dist-packages
? - Ciò influirà anche su
pip
?
Grazie a tutti coloro che possono chiarire questo!
Soluzione
Sarei tentato di hackerarlo rendendo i pacchetti del sito un collegamento a dist-pacchetti, ma immagino che ciò potrebbe influenzare altri casi in cui si desidera installare un'estensione diversa da quella di Ubuntu. Non riesco a pensare a un'altra risposta a 1 tranne che a modificare le fonti di virtualenv (con ubuntu e virtualenv così popolari non sarei sorpreso di trovare già esistenti versioni ottimizzate).
Ri 2, se stai usando / usr / local / bin / python dovresti usare la versione / usr / local della lib (compresi i pacchetti del sito) e viceversa se stai usando / usr / bin / python .
Per quanto riguarda 3, ci sarà qualcosa lì se si installa un'estensione per / usr / bin / python da fonti (non tramite easy_install o dalla distribuzione di Ubuntu).
Per quanto riguarda 4, sì, le voci precedenti sul percorso hanno la precedenza.
Per quanto riguarda 5, easy_install è facile solo nel suo nome: fa così tanta magia oscura che è stato accuratamente tenuto fuori dalla libreria standard di Python nonostante la sua convenienza perché il consenso tra noi committenti di Python è che la magia oscura profonda per comodità è " facile " solo in superficie.
Per quanto riguarda il 6, penso che sia una modifica di Ubuntu a easy_install - se è giusto, allora è definito ovunque i gestori di Ubuntu Canonical o altri prendano le loro decisioni collettive.
Ri 7, scusa, non ne ho idea - non ho Ubuntu abbastanza recente da controllare.
Altri suggerimenti
Credo che la risposta di Mike Orr da la mailing list di virtual-env sembra essere la migliore. Si noti che il PO ha pubblicato questa domanda in entrambi i luoghi.
Contenuto originale della posta:
Anni fa Debian ha creato / usr / local / lib / pythonVERSION / site-pacchetti, e compilato il binario Python per includerlo nella ricerca predefinita sentiero. Ubuntu ha seguito l'esempio di Debian come al solito. The Python agli sviluppatori non è piaciuto questo perché si otterrebbero interferenze con a installato localmente / usr / local / bin / python usando gli stessi pacchetti del sito directory. Ubuntu alla fine decise di abbandonare i pacchetti del sito e di usarli dist-pacchetti invece, un nome che hanno inventato per non farlo interferire con qualsiasi cosa. La storia imminente è là fuori da qualche parte se lo cerchi su Google, da qualche parte nel bug tracker di Python o distrai SIG o ad esempio.
Il sistema funziona, almeno se si utilizza il pacchetto Ubuntu virtualenv. Alcune persone hanno avuto problemi utilizzando un virtualenv installato localmente su Ubuntu perché le voci magic sys.path non venivano aggiunte o qualcosa. Non sono sicuro di --no-site-pacchetti perché non lo uso mai quell'opzione: eseguo PIL e mysqldb dai pacchetti Ubuntu perché a volte può essere difficile compilare le loro dipendenze C. (Ho bisogno del file di intestazione a destra, Python ignora i file di intestazione, ecc.)
Quindi vanno dentro i pacchetti Ubuntu Python / Usr / lib / pythonVERSION / dist-packages. O quel supporto per Python directory per qualche motivo. I pacchetti Python installati localmente entrano in / usr / local / lib / pythonVERSION / dist-pacchetti di default. Ogni volta che installare un sistema Ubuntu 9.04 che eseguo:
$ sudo apt-get install python-setuptools (6.0c9) $ sudo apt-get install python-virtualenv (1.3.3) $ sudo easy_install pip $ sudo pip installa virtualenvwrapper
I virtualenv funzionano bene in questo modo, anche se non ho provato --no-site-pacchetti.
Sto provando a girare virtualenv e il flag --no-site-pacchetti sembra non fare nulla con Ubuntu. Ho installato virtualenv 1.3.3 con easy_install (che ho aggiornato a setuptools 0.6c9)
Queste versioni sono entrambe in Ubuntu 9.04, quindi la stai rendendo più difficile installandoli localmente.
e tutto sembra essere installato in /usr/local/lib/python2.6/dist-packages
Si
Suppongo che durante l'installazione di un pacchetto usando apt-get, sia inserito in / usr / lib / python2.6 / dist-pacchetti /?
Si
- È il primo arrivato, primo servito sul percorso? Se ne avessi uno più recente versione del pacchetto XYZ installato in /usr/local/lib/python2.6/dist- pacchetti / e precedenti (da ubuntu repos / apt-get) in / usr / lib / python2.6 / dist-pacchetti, quale viene importato quando si importa xyz? Suppongo che questo sia basato sull'elenco dei percorsi, sì?
sys.path viene scansionato in ordine. L'unica cosa divertente è che le uova .pth essere inserito prima o poi nel percorso di quanto alcune persone si aspettino. Ma se stai usando pip per tutto ciò che può fare (ad es. per installare pip stesso, uova precompilate e un'istantanea di una directory locale che è a copia piuttosto che un collegamento uovo), non avrai comunque molte uova .pth.
- Perché diavolo è così confuso? C'è qualcosa che io sono manca qui?
Non è ben documentato. L'ho capito scansionando il web.
- Interesserà anche pip?
Sì, pip verrà installato automaticamente su / / / pythonVERSION / site-packages local / lib usr. Utilizza " pip install -E $ VIRTUAL_ENV nomepacchetto " da installare in un virtualenv.
Non dovresti davvero toccare l'installazione di Ubuntu Python a meno che tu non stia costruendo strumenti di amministrazione di sistema o costruendo qualcosa che potrebbe essere considerato un nuovo servizio di sistema.
Se si utilizza Ubuntu per sviluppare o distribuire applicazioni Python, creare sempre il proprio Python dal sorgente, caricarlo e utilizzarlo per la distribuzione. In questo modo avrai tutte le directory nel posto giusto e virtualenv funzionerà normalmente. Se distribuirai diverse app Python sul server, rendi Python live in un posto come / home / python
o / opt / python
o da qualche parte al di fuori della tua home directory . Assicurati di disporre delle autorizzazioni di scrittura per il gruppo di sviluppatori ( utenti
?) In modo che le persone possano aggiungere facilmente pacchetti.
Ciò consente anche di avere due livelli di pacchetti. Quelli che sono i tuoi strumenti standard interni possono essere installati nella tua distribuzione Python e far parte del tarball che dispieghi, e solo i pacchetti specifici dell'app sarebbero in virtualenv.
Non aggiornare o modificare il sistema Ubuntu installato Python.
Bene, ho un Ubuntu 9.04 e ho provato rapidamente a configurare un paio di sandbox con pacchetti di siti e uno senza. E le cose funzionano bene.
L'unica differenza nell'approccio che ho adottato è che ho usato il pacchetto python-virtualenv di Ubuntu (1.3.3). E supponiamo che sia ottimizzato dal team di Ubuntu per adattarsi alle configurazioni di Ubuntu.
Per riassumere disabilita virtualenv easy_installed per un po ', usa python-virtualenv in pacchetto e vedi se soddisfa le tue aspettative.
In effetti utilizziamo un'installazione simile per la produzione senza alcun problema. Il resto ha già risposto ad Alex.
Un altro modo per risolverlo:
https://stackoverflow.com/a/17265840/202168
Ricordati di farlo in ogni virtualenv dove ne hai bisogno, ma non fa affidamento su hack o una versione speciale di virtualenv