web-dev-qa-db-fra.com

Renommer un dossier virtualenv sans le casser

J'ai créé un dossier et initialisé une instance de virtualenv.

$ mkdir myproject
$ cd myproject
$ virtualenv env

Quand je cours (env)$ pip freeze, il montre les paquets installés comme il se doit.

Maintenant je veux renommer myproject/ à project/.

$ mv myproject/ project/

Cependant, maintenant quand je cours

$ . env/bin/activate
(env)$ pip freeze

il est dit que pip n'est pas installé. Comment renommer le dossier du projet sans casser l'environnement?

156
Riley Watkins

Vous devez ajuster votre installation pour utiliser des chemins relatifs. virtualenv fournit cela avec le --relocatable option. De les docs :

Normalement, les environnements sont liés à un chemin spécifique. Cela signifie que vous ne pouvez pas déplacer un environnement ou le copier sur un autre ordinateur. Vous pouvez corriger un environnement pour le rendre déplaçable avec la commande:

$ virtualenv --relocatable ENV

REMARQUE: ENV est le nom de l'environnement virtuel. Vous devez l'exécuter en dehors du répertoire ENV.

Certains des fichiers créés par setuptools ou distribution utiliseront des chemins relatifs et modifieront tous les scripts afin qu'ils utilisent activate_this.py au lieu d'utiliser l'emplacement de l'interprète Python pour sélectionner l'environnement).

Remarque: vous devez l'exécuter après avoir installé les packages dans l'environnement. Si vous rendez un environnement relogeable, puis installez un nouveau package, vous devez réexécuter virtualenv --relocatable.

142
ire_and_curses

Je crois que "savoir pourquoi" importe plus que "savoir comment". Donc, voici une autre approche pour résoudre ce problème.

Quand vous courez . env/bin/activate, il exécute les commandes suivantes (en utilisant /tmp par exemple):

VIRTUAL_ENV="/tmp/myproject/env"
export VIRTUAL_ENV

Cependant, vous venez de renommer myproject en project. La commande n'a donc pas pu être exécutée. C'est pourquoi on dit pip is not installed, parce que vous n'avez pas installé pip dans l'environnement global du système et que votre virtualenv pip n'a pas été importé correctement.

Si vous souhaitez résoudre ce problème manuellement, procédez comme suit:

  1. Avec votre éditeur préféré comme Vim, modifiez /tmp/project/env/bin/activate habituellement à la ligne 42:

    VIRTUAL_ENV='/tmp/myproject/env' => VIRTUAL_ENV='/tmp/project/env'

  2. Modifier /tmp/project/env/bin/pip dans la ligne 1:

    #!/tmp/myproject/env/bin/python => #!/tmp/project/env/bin/python

Après cela, réactivez votre environnement virtuel env et vous verrez que votre pip est revenu.

103
holys

NOTE: Comme @jb. souligne, cette solution ne s'applique qu'aux virtualenvs facilement (re) créés. Si un environnement prend plusieurs heures pour installer cette solution n'est pas recommandée


Les serveurs virtuels sont excellents car ils sont faciles à créer et à utiliser; ils vous empêchent de vous enfermer dans une seule configuration. Si vous connaissez les exigences du projet ou si vous pouvez les obtenir, Créer un nouveau virtualenv:

  • Créer un fichier requirements.txt

    (env)$ pip freeze > requirements.txt

    • Si vous ne pouvez pas créer le fichier requirements.txt, Vérifiez env/lib/pythonX.X/site-packages Avant de supprimer l'original env.
  • Supprimer le (env) Existant

    deactivate && rm -rf env

  • Créer un nouveau virtualenv, l'activer et installer la configuration requise

    virtualenv env && . env/bin/activate && pip install -r requirements.txt


Vous pouvez également utiliser virtualenvwrapper pour simplifier un peu les choses car tous les virtualenv sont conservés dans un emplacement centralisé.

$(old-venv) pip freeze > temp-reqs.txt
$(old-venv) deactivate
$ mkvirtualenv new-venv
$(new-venv) pip install -r temp-reqs.txt
$(new-venv) rmvirtualenv old-venv
36
bnjmn

J'installe toujours virtualenvwrapper pour aider. Depuis l'invite du shell:

pip install virtualenvwrapper

Il existe un moyen documenté dans les documents virtualenvwrapper - cpvirtualenv C'est ce que vous faites. Assurez-vous de ne plus être dans votre environnement et de revenir à l'invite du shell. Tapez ceci avec les noms requis:

cpvirtualenv oldenv newenv

Et ensuite, si nécessaire:

rmvirtualenv oldenv

Pour aller à votre newenv:

workon newenv
28
Afrowave

Vous pouvez résoudre votre problème en procédant comme suit:

  1. renommer votre répertoire
  2. réexécutez ceci: $ virtualenv ..\path\renamed_directory
  3. virtualenv corrigera les associations de répertoires tout en laissant vos paquets en place
  4. $ scripts/activate
  5. $ pip freeze pour vérifier que vos paquets sont en place
  6. Une mise en garde importante: si vous avez des dépendances de chemin statiques dans les fichiers de script de votre répertoire virtualenv, vous devrez les modifier manuellement.
16
ryankdwyer

Une autre façon de le faire qui a fonctionné pour moi plusieurs fois sans problème est virtualenv-clone :

pip install virtualenv-clone
virtualenv-clone old-dir/env new-dir/env
11
Antony Hatchkins

(dans le dossier du projet)

cd bin
sed -i 's/old_dir_name/new_dir_name/g' *

N'oubliez pas de désactiver et d'activer

4
Ignacio

virtualenv --relocatable ENV n'est pas une solution souhaitable. Je suppose que la plupart des gens veulent pouvoir renommer virtualenv sans aucun effet secondaire à long terme.

J'ai donc créé un outil simple pour faire exactement cela. La page du projet pour virtualenv-mv le décrit un peu plus en détail, mais vous pouvez utiliser essentiellement virtualenv-mv comme vous utiliseriez une implémentation simple de mv (sans aucune option).

Par exemple:

virtualenv-mv myproject project

S'il vous plaît noter cependant que je viens de pirater cette place. Il pourrait se rompre dans des circonstances inhabituelles (par exemple, des serveurs virtuels liés par un lien symbolique), alors soyez prudent (sauvegardez ce que vous ne pouvez pas vous permettre de perdre) et faites-le-moi savoir si vous rencontrez des problèmes.

1
Six