web-dev-qa-db-fra.com

Puis-je déplacer un virtualenv?

Cette question n'est pas un doublon.

Il ne s’agit pas seulement de renommer un environnement virtuel, mais bien de déplacer dans un autre répertoire, y compris éventuellement le répertoire d’un autre utilisateur.

Ce n'est pas la même chose que de simplement renommer un environnement virtuel, en particulier pour les personnes non familiarisées avec virtualenvs.

Si je crée un fichier virtualenv et que je le déplace dans un autre dossier, cela fonctionnera-t-il toujours?

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

... plus tard dans la journée, l'environnement virtuel a déménagé ...

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

Question:

Est-ce que ça va marcher?

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

Je veux dire ceci moins comme une question de la sagesse d'essayer ceci (à moins que cette sagesse soit humoristique, bien sûr), et plus de savoir si c'est possible. Je veux vraiment savoir s'il est possible de faire en Python 3, ou si je dois juste le sucer et le cloner.

Puis-je simplement mv un virtualenv comme ça sans tristesse? Je veux éviter la tristesse.

55
Nathan Basanese

MAIS HÉLAS:

Non, vous ne pouvez pas simplement mv. Il existe des solutions de contournement, mais il peut être plus facile à réinstaller.

(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 beaucoup de frustration, et les travaux suivants

$
$
$ pip3 search foaas

Sauf que ce n'est pas de my-python-venv, ergo tristesse.

Vous voulez mv votre virtualenv et l'utiliser, sinon non modifié?

Réponse courte:

I'll let Boromir say it, so he can make it clear:

Eh bien, ya ne peut pas.

5
Nathan Basanese

Oui. Il est possible de le déplacer sur la même plateforme. Vous pouvez utiliser --relocatable sur un environnement existant.

De --help:

--relocatable - Rendre un environnement virtualenv EXISTANT relogeable. Cela corrige les scripts et rend tous les fichiers .pth relatifs.

CEPENDANT, cela ne semble pas changer le script activate, mais seulement le script pip* et easy_install* scripts. Dans le script activate, le $VIRTUAL_ENV variable d’environnement codée en dur comme la valeur originale /path/to/original/venv. Le $VIRTUAL_ENV variable sert également à définir le PATH de votre environnement actif. Il doit donc être modifié en fonction du nouvel emplacement pour pouvoir appeler python et pip etc. sans chemin absolu.

Pour résoudre ce problème, vous pouvez modifier le $VIRTUAL_ENV variable d’environnement dans le script activate (par exemple, en utilisant sed), et tout devrait bien se passer.

Un exemple d'utilisation:

$ 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

Hourra, maintenant vous pouvez installer des objets et les charger dans votre nouvel environnement virtuel.

55
hilcharge

Le --relocatable argument de virtualenv apparaît pour vous permettre de le faire.

7
Ruth Franklin

Oui, cela devrait être possible si vous n'avez rien fait qui dépend du répertoire actuel de virtualenv.

Cependant, si vous avez le choix, la meilleure chose à faire est de créer un nouveau virtualenv et de commencer à utiliser le nouveau virtualenv. C'est le choix le plus sûr et le moins susceptible de causer des problèmes plus tard.

La documentation mentionne cela :

Chaque virtualenv contient des informations de chemin codées en dur,

Par exemple, si vous avez exécuté setvirtualenvproject, il ne sera pas possible de basculer vers le bon répertoire après avoir exécuté workon ... donc, dans ce cas, vous devez résoudre ce problème manuellement.

En général, virtualenv n’est guère plus qu’un répertoire contenant les fichiers d’interpréteur nécessaires Python) ainsi que les paquetages dont vous avez besoin.

6
Simeon Visser