Fai in modo che virtualenv erediti pacchetti specifici dai tuoi pacchetti siti globali


209

Sto cercando un modo per creare un virtualenv che conterrà solo alcune librerie (che ho scelto) dell'installazione base di Python.

Per essere più concreti, sto cercando di importare il mio matplotlib in virtualenv durante la creazione di virtualenv. Non può essere installato in modo efficiente con pip o easy_install poiché manca alcune librerie del compilatore fortran. Il modo in cui l'ho fatto finora è stato quello di copiare manualmente da

/usr/lib/python2.7/dist-packages/ to virtualenv_name/lib/python2.7/dist-packages/

tuttavia ciò impedisce che i collegamenti importati manualmente vengano registrati dal tuorlo (che stampa tutte le librerie attualmente disponibili in virtualenv).

Quindi, c'è un modo per fare una variante selettiva di

virtualenv --system-site-packages

16
un promemoria delicato: selezionare una risposta se una delle opzioni seguenti sembra funzionare.
Foobaremade

1
sembra che 12 persone abbiano testato per te negli ultimi mesi ...
foobaremade

2
Perché infastidire l'OP? Tutti possiamo vedere qual è la risposta più popolare; importa davvero se lo accetta? Penso che la sua integrità nei test per se stesso, invece di limitarsi a spuntare la risposta più popolare, dovrebbe essere ammirata.
Michael Scheper,

5
2013: i punteggi delle risposte tra risposte corrette e non corrette sono abbastanza simili. OP dice che proverà. 2016: Michael Scheper è così impressionato che OP (tre anni fa) ha dichiarato che avrebbe testato. 2017: mi imbatto di nuovo in questa domanda e mi diverto.
foobaremade

2
Non c'è una risposta corretta. OP ha chiesto selettivo --system-site-packages. Risposte suggerisce di utilizzare non selettivi --system-site-packagese quindi di installare alcuni pacchetti localmente, cosa è diverso e ha implicazioni diverse.
Piotr Jurkiewicz,

Risposte:


239

Crea l'ambiente con virtualenv --system-site-packages. Quindi, attiva virtualenv e quando vuoi che le cose siano installate in virtualenv piuttosto che nel sistema python, usa pip install --ignore-installedo pip install -I. In questo modo pip installerà ciò che hai richiesto localmente anche se esiste una versione a livello di sistema. Il tuo interprete python apparirà per primo nella directory dei pacchetti di virtualenv, quindi quei pacchetti dovrebbero oscurare quelli globali.


45
Usando -I, reinstallerai sempre i pacchetti, anche se esistono già nella directory dei pacchetti del sito a livello di sistema. Se invece usi -U, installerà le versioni più recenti dei pacchetti nel tuo virtualenv, ma non reinstallerà i pacchetti che sono già disponibili nel sistema con la versione richiesta.
Danilo Bargen,

15
Sai se esiste un modo per "attivare" l'opzione --system-site-pacchetti su un ambiente virtuale creato in precedenza? Mi piacerebbe evitare il fastidio di reinstallare tutti i miei pacchetti locali!
Gabriel,


Ho trovato questa risposta molto interessante, tuttavia ho avuto un caso molto strano in cui non ha funzionato. Ho un virtualenv con no-global-site-packagesabilitato. Ma per qualche ragione non so che esistesse un pacchetto che veniva usato dal sistema globale. L'uso pip install -Iper il pacchetto dall'interno di virtualenv non ha funzionato. Alla fine ho disinstallato temporaneamente il pacchetto sia dal sistema virtualenv che dal sistema globale, quindi ho potuto installarlo nuovamente nel virtualenv e nel sistema (in quell'ordine). Quindi ora funziona benissimo.
kstenger,

3
-1 La domanda richiede di rendere visibili alcuni pacchetti, non tutti tranne i pacchetti ombreggiati. La whitelist di un set limitato sarebbe molto più sicura della whitelist di tutto perché consente di garantire che tutti i pacchetti debbano esistere nel venv tranne quelli esplicitamente autorizzati.
bluenote10,

19

È possibile utilizzare --system-site-packagese quindi "sovrainstallare" le cose specifiche per virtualenv. In questo modo, tutto ciò che installi nel tuo virtualenv sarà preso da lì, altrimenti sarà preso dal tuo sistema.


Non sono esattamente sicuro di cosa non sia chiaro, ma proverò: se crei un virtualenv con l'opzione --system-site-pacchetti, il sistema proverà prima a trovare i pacchetti nel tuo virtualenv, se non lo trova lì, lo farà prova a trovarlo nell'installazione di Python di sistema. Solo se non lo trova neanche lì, genererà e ImportError.
schacki,

4
L'unico problema con questo approccio è che ora hai tutte le librerie di sistema. Dove si potrebbe desiderare un controllo molto stretto su ciò che è installato.
Dwayne,

7
Ciò che non è chiaro è come questo sia effettivamente possibile! Se installi pip myprog in un virtualenv creato con --system-site-pacchetti in cui myprog esiste nel sistema, non verrà "overinstallato" myprog. Scoprirà semplicemente che esiste myprog e dirà "Requisito già soddisfatto". Quindi ... cosa intendevi?
Foobaremade

-5

Installa env virtuale con

virtualenv --system-site-packages

e usare pip install -U to install matplotlib


3
Questo è l'opposto di ciò che la domanda ha posto.
Dan Getz,

-7

È possibile utilizzare virtualenv --clear. che non installa alcun pacchetto, quindi installa quelli desiderati.


Questa non è una risposta alla domanda reale su come utilizzare alcuni pacchetti di sistema
MrLeeh
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.