Sta cambiando il PERCORSO in C paragonabile a 'source' un virtualenv in Python?

0

Virtualenv aggiunge il proprio percorso a $ PATH, sovrascrivendo efficacemente Python a quello selezionato quando viene creato virtualenv. Cambiare il $ PATH sarebbe equivalente a virtualenv in un linguaggio compilato con librerie condivise?

Te lo chiedo perché sembra che non ci sia una facile sostituzione di virtualenv per es. C (senza attivare una VM / finestra mobile). Mi chiedo se questo è un vincolo teorico o solo una sfida tecnica.

Operativamente, mi chiedo cosa sia impossibile come qualcosa

activate
apt-get/brew install X
deactivate

dove activate/deactivate fa un po 'di magia per l'installazione del gestore pacchetti in una posizione specifica, e gli indicatori di compilazione funzionano di conseguenza (come virtualenv per pip ).

    
posta Jorge Leitão 29.01.2017 - 15:49
fonte

2 risposte

2

PATH e virtaulenv sono totalmente diversi nello scopo che servono e in che modo funzionano. Come hai detto, virtualenv isola un interprete python e alcune librerie sul tuo sistema dagli altri e impedisce a nuovi / altri pacchetti da entrambi i lati di sanguinare nell'altro.

Il PATH, d'altra parte, è completamente denominato "PATH del file eseguibile del sistema". Indica al sistema dove cercare il comando appena inserito, quando hai omesso il percorso completo. Quindi, quando cambi il PATH per il tuo compilatore C, solo "aiuta" il sistema a trovare il compilatore che vuoi - di solito anteponi il vero percorso a cui sei interessato, questo viene cercato prima dal sistema, e la magia accade.

Questo è vero solo se è necessario trovare gli eseguibili (ad es. il compilatore). Quando succede, tutto ricomincia quando si digita il comando successivo. Ciò che è più importante con il compilatore C, tuttavia, è che non trova le sue librerie sul PATH ( per l'eccezione notevole che dimostra la regola, guarda la fine del mio post ). In primo luogo, ogni compilatore è preconfigurato con determinate directory in cui trovare i suoi include, e anche altre determinate directory dove trovare le sue librerie standard C o C ++. Oltre a ciò, quando si compila, si può dare a directory aggiuntive dove cercare il sistema o le librerie di terze parti. Una volta completata la compilazione, il sistema la cercherà sul PATH quando digiti executable anziché /full/path/to/executable , ma solo per trovarlo e avviarlo. Il tuo eseguibile cercherà LDPATH (cioè il percorso della libreria del sistema) per trovare tutte le librerie a cui è stato fatto riferimento durante la compilazione e che deve essere eseguito. E fallirà se nessuna di queste librerie non è raggiungibile su LDPATH.

Ci sono strumenti che possono aiutarti a creare qualcosa di simile a virtualenv per python, e hanno tutti i loro capricci, quindi devi leggerli prima di usarli. Nulla di ciò che conosco è conveniente come virtualenv però.

Uno di questi è chroot - isola tutto sotto una determinata cartella dal resto del sistema e qualsiasi processo che inizi in un ambiente chroot può utilizzare solo ciò che è disponibile in questa cartella radice. Ma devi preparare da te la cartella - ricreare le cartelle di sistema che vuoi avere, copiare tutte le librerie che l'eseguibile isolato ha bisogno nella posizione corretta, copiare qualsiasi altro eseguibile che potrebbe tornare utile, copiare le loro dipendenze, i file di configurazione, ecc. nella posizione corretta, tutto a mano, prima di poter avviare l'ambiente isolato. Non così banale come virtualenv.

Nota: solo Windows non distingue tra librerie ed eseguibili e cerca entrambi nel PATH eseguibile. Ecco perché è possibile ottenere l'effetto di isolare un eseguibile mettendo tutte le DLL (librerie) nella versione di cui hai bisogno nella stessa cartella dell'eseguibile. Quindi, se questa cartella specifica non è inclusa nel PATH di sistema, il resto del sistema non viene modificato. Quando si avvia il software dalla directory in cui si trova, trova le sue dipendenze prima di provare le cartelle del sistema. Tuttavia, questo non sempre funziona, dato che le librerie hanno spesso dipendenze proprie e più DLL si utilizzano, il compito più complesso di trovare e isolare le loro dipendenze ...

    
risposta data 29.01.2017 - 16:33
fonte
0

Virtualenv ha un numero di effetti:

  • cambia PATH, che consente di rendere disponibile un diverso set di programmi relativi a Python.

    • uno di questi programmi è l'interprete Python, che influenza la versione della lingua utilizzata.
  • cambia i percorsi del modulo, quindi i moduli vengono caricati da e installati in una posizione nel virtualenv.

Per i programmi C:

  • È possibile selezionare la versione della lingua utilizzando un compilatore diverso o fornire un'opzione del compilatore. Come farlo dipende dal tuo compilatore e dal tuo sistema di compilazione.

  • Puoi modificare il PERCORSO per influenzare quali programmi sono caricati.

  • È possibile modificare i percorsi di inclusione e i percorsi del linker in fase di compilazione / tempo di collegamento per influenzare le librerie utilizzate. Leggi la documentazione del tuo compilatore e linker per i dettagli.

    Per le librerie caricate dinamicamente, puoi cambiare il percorso di ricerca per gli oggetti condivisi, ad es. attraverso la variabile LD_LIBRARY_PATH.

Per quanto ne so, non esiste un sistema one-stop come virtualenv per gestire tutti questi in un colpo solo.

Tuttavia, chroot ("change root") potrebbe tornare utile se hai a che fare con percorsi assoluti che non puoi cambiare. Ciò consente di selezionare una directory come nuova directory root per un comando, ad es.

chroot ./my-env command args...

Questo richiede di popolare la directory my-env con tutti i file e i programmi necessari, il che può richiedere molto lavoro. Si noti inoltre che un ambiente chroot non è un contenitore e non rappresenta un limite di sicurezza: modifica semplicemente la risoluzione dei nomi dei percorsi assoluti. Al giorno d'oggi, è probabilmente più facile usare un'immagine Docker per questi casi d'uso.

    
risposta data 29.01.2017 - 16:21
fonte

Leggi altre domande sui tag