2015-09-04 24 views
28

Questa domanda non è una replica.Posso spostare un virtualenv?

Non appartiene solo a rinominare un ambiente virtuale, ma in realtà in movimento in una directory diversa, tra cui, potenzialmente, la directory di un utente differente.

Non è la stessa cosa che semplicemente rinominare un ambiente virtuale, in particolare per le persone che non hanno familiarità con i virtualenv.

Se creo un virtualenv e lo sposto in una cartella diversa, funzionerà ancora?

$ virtualenv -p /usr/bin/python3 /home/me/Env/my-python-venv 
$ source Env/my-python-venv/bin/activate 
(my-python-venv) $ 

... più tardi quel giorno, l'ambiente virtuale SPOSTATO ...

(my-python-venv) $ deactivate 
$ mkdir -p /home/me/PeskyPartyPEnvs 
$ mv /home/me/Env/my-python-venv /home/me/PeskyPartyPEnvs/ 

Domanda:

Sarà questo lavoro?

$ source /home/me/PeskyPartyPEnvs/my-python-venv/bin/activate 
(my-python-venv) $ /home/me/PeskyPartyPEnvs/my-python-venv/bin/pip3 install foaas 

voglio dire questo come meno di una domanda sull'opportunità di provare questo (a meno che la saggezza è umoristico, ovviamente), e di più se è possibile. Voglio davvero sapere se è possibile farlo in Python 3, o se devo semplicemente scrivere su suck it up e clonarlo.

Posso solo mv un virtualenv come quello senza tristezza? Voglio evitare la tristezza.

+1

//, ho già letto il post su come rinominare un virtualenv, ma non si applica a questo caso. –

+1

//, In effetti lo spostamento di una virtualenv in un'altra cartella presenta differenze, credo, sufficienti a giustificare una domanda separata. –

+0

Copia semplicemente la cartella ** venv ** dal progetto. Incollalo nella cartella del progetto richiesta in cui vuoi spostarti. Se stai usando un software GUI come pycharm (in ** Setting -> project interpreter -> aggiungi env locale ora dai il percorso alla cartella mossa :-) –

risposta

1

//, ma ahimè:

(my-python-venv)$ /home/me/PeskyPartyPEnvs/pip3 install foaas 
zsh: /home/me/PeskyPartyPEnvs/pip3: bad interpreter: /home/me/Env/my-python-venv/bin/python3: no such file or directory 
(my-python-venv)$ deactivate 
$ 

... Presse enter un sacco di frustrazione, e funziona il seguente

$ 
$ 
$ pip3 search foaas 

Solo che non è da my-python-venv, ergo tristezza.

Vuoi mv il tuo virtualenv e usarlo, altrimenti non modificato?

Risposta breve: Beh, sì non è possibile.

+0

a meno che non si desideri ottenere un errore e modificarlo in modo appropriato: sono i collegamenti nei file binari nel cestino che causano il problema di movimento. Se sai da dove vieni FROM puoi usare qualcosa come 'find bin -type f -exec ex -sc"% s, $ {FROM}, $ {PWD}, g | x "{} \;' assumendo il tuo bin e lib sono nella tua cartella venv attuale. Uso questo come un modo veloce e sporco per copiare e spostare env virtuali python3 con molti pacchetti pip installati. –

3

Sì, questo dovrebbe essere possibile se non si è fatto nulla che dipende dalla directory corrente del virtualenv.

Tuttavia, se si ha la scelta, la cosa migliore da fare è creare una nuova virtualenv e iniziare a utilizzare la nuova virtualenv. Questa è la scelta più sicura e meno probabilità di causare problemi in seguito.

La documentazione does mention that:

Ogni virtualenv ha informazioni sul percorso hard-coded in esso,

Ad esempio, se si è eseguito setvirtualenvproject allora non sarà in grado di passare alla directory giusta dopo aver eseguito workon ... quindi in tal caso è necessario correggerlo manualmente.

In generale un virtualenv è poco più di una directory con i file dell'interprete Python necessari più i pacchetti necessari.

+1

//, sembra come spostarlo ovunque, anche se è un nuovo 'virtualenv' come nell'esempio precedente, mette in disordine le informazioni sul percorso. Peccato per gli sciocchi che provano a copiare i loro 'virtualenv' da qualche parte. Non avranno il vantaggio di un errore "interprete cattivo" immediato. "Shenanigans interessanti" ne derivano per loro. –

4

L'argomento --relocatable su virtualenv sembra consentire di eseguire questa operazione.

+0

//, Se riesco a farlo funzionare, abbiamo noi stessi la risposta accettata, amici miei. –

+0

//, Questo si basa solo su percorsi relativi, o si aggira in qualche modo in qualche modo? –

+1

--relocatable funziona solo su ambienti virtuali esistenti. Esegui 'virtualenv --relocatable my-python-venv' DOPO che l'ambiente esiste già. – hilcharge

33

Sì. È possibile spostarlo sulla stessa piattaforma. È possibile utilizzare --relocatable in un ambiente esistente.

Da --help:

--relocatable - Fai ambiente virtualenv ESISTENTE relocatable. Questo corregge gli script e rende tutti i file .pth relativi.

Tuttavia, questo non sembra modificare lo script activate, e cambia invece solo gli script pip* e easy_install*. Nello script activate, la variabile di ambiente $VIRTUAL_ENV hardcoded come originale /path/to/original/venv. La variabile $VIRTUAL_ENV viene utilizzata per impostare anche lo PATH del proprio ambiente attivo, pertanto deve essere modificato in base alla nuova posizione per chiamare python e pip ecc. Senza percorso assoluto.

Per risolvere questo problema, è possibile modificare la variabile di ambiente $VIRTUAL_ENV nello script activate (ad esempio utilizzando sed) e tutto dovrebbe essere a posto.

Un esempio di utilizzo:

$ cd ~/first 
$ virtualenv my-venv 
$ grep 'VIRTUAL_ENV=' my-venv/bin/activate 
VIRTUAL_ENV="/home/username/first/my-venv" 
$ virtualenv --relocatable my-venv 
Making script my-venv/bin/easy_install relative 
Making script my-venv/bin/easy_install-2.7 relative 
Making script my-venv/bin/pip relative 
Making script my-venv/bin/pip2 relative 
Making script my-venv/bin/pip2.7 relative 
### Note that `activate` has not been touched 
$ mkdir ~/second 
$ mv my-venv ~/second 
$ cd ~/second 
$ grep 'VIRTUAL_ENV=' my-venv/bin/activate 
VIRTUAL_ENV=/home/username/first/my-venv 
### (This variable hasn't been changed, it still refers to the old, now non-existent directory!) 
$ sed -i -e 's|username/first|username/second|' my-venv/bin/activate 
## sed can be used to change the path. 
## Note that the `-i` (in place) flag won't work on all machines. 
$ source my-venv/bin/activate 
(my-venv) $ pip install foass 
... 
(my-venv) $ python 
[...] 
> import foass 

Evviva, ora è possibile installare le cose e caricarli nel vostro ambiente virtuale appena trova.

+0

//, Test ora. Ho complicato il mio particolare caso d'uso. Ho a che fare con un sacco di stranezze multipiattaforma, quindi se non funziona per me, ciò non significa che sia una cattiva soluzione. –

+0

//, Hm. Questo non sembra in realtà finire per rendere questi rilocabili. Continuo a ricevere qualche errore sul fatto che non siano file di script "normali". –

+0

Quali script non sono "normali"? Se ricordo, lo script di attivazione env virtuale per lo più cambia solo le variabili d'ambiente. Ma se il python all'interno del virtualenv non gira sulla nuova piattaforma, allora probabilmente non è un problema env virtuale, il suo problema del programma compilato su piattaforme diverse. Puoi eseguire il normale interprete Python? Inoltre, quale shell stai usando? – hilcharge