J'ai créé un dossier et y ai initialisé une instance virtualenv.
$ mkdir myproject
$ cd myproject
$ virtualenv env
Lorsque je cours (env)$ pip freeze
, il affiche les packages installés comme il se doit.
Maintenant, je veux renommer myproject/
en project/
.
$ mv myproject/ project/
Cependant, maintenant quand je cours
$ . env/bin/activate
(env)$ pip freeze
il dit que pip n'est pas installé. Comment renommer le dossier du projet sans interrompre l'environnement?
python
ubuntu
virtualenv
pip
Riley Watkins
la source
la source
Réponses:
Vous devez ajuster votre installation pour utiliser des chemins relatifs.
virtualenv
prévoit cela avec l'--relocatable
option. À partir de la documentation :la source
grep -EIr '\Wold_venv_name\W' /path/to/new_venv
aidera à trouver tous les shabangs qui utilisent l'ancien venv, mais ne constitue pas une vérification complète du venv déplacé..project
fichier virtualenvwrapper , qui contient le chemin d'accès au code source qui dépend du virtualenv, en supposant que vous utilisez virutalenvwrapper et que vous avez également renommé le répertoire du projet pour correspondre au nouveau virtualenv.Je crois que "savoir pourquoi" compte plus que "savoir comment" . Alors, voici une autre approche pour résoudre ce problème.
Lorsque vous exécutez
. env/bin/activate
, il exécute en fait les commandes suivantes (en utilisant/tmp
par exemple):Cependant, vous venez de renommer
myproject
enproject
, de sorte que la commande n'a pas pu s'exécuter. C'est pourquoi il est ditpip is not installed
, parce que vous ne l'avez pas installépip
dans l'environnement global du système et que votre virtualenvpip
ne provient pas correctement.Si vous souhaitez résoudre ce problème manuellement, procédez comme suit:
Avec votre éditeur préféré comme Vim, modifiez
/tmp/project/env/bin/activate
généralement à la ligne 42:VIRTUAL_ENV='/tmp/myproject/env'
=>VIRTUAL_ENV='/tmp/project/env'
Modifier
/tmp/project/env/bin/pip
à la ligne 1:#!/tmp/myproject/env/bin/python
=>#!/tmp/project/env/bin/python
Après cela, activez à nouveau votre environnement virtuel
env
et vous verrez votrepip
retour.la source
grep -iHnR venv-name /path/to/venv-name | grep -v "^Binary file" | grep -i venv-name
. En fait, j'ai remarqué que dans l'une de mes instances Django, beaucoup de paquets contenaient le "chemin vers Python sh-bang".virtualenv
. Il y a peut-être un cas d'utilisation que je n'utilise pas et que je ne rencontre donc pas le problème.virtualenv
. Pour le résoudre, j'ai édité l'en-tête bash (comment s'appelle-t-il?) Dans leipython
fichier, puis cela a bien fonctionné.REMARQUE: comme @jb. souligne que cette solution ne s'applique qu'aux (re) créations faciles
virtualenv
. Si un environnement prend plusieurs heures pour installer cette solution n'est pas recommandéeLes Virtualenvs sont excellents car ils sont faciles à créer et à changer; ils vous empêchent de vous enfermer dans une seule configuration. Si vous connaissez les exigences du projet ou pouvez les obtenir, créez un nouveau
virtualenv
:Créer un
requirements.txt
fichier(env)$ pip freeze > requirements.txt
requirements.txt
fichier, vérifiezenv/lib/pythonX.X/site-packages
avant de supprimer l'originalenv
.Supprimer l'existant
(env)
deactivate && rm -rf env
Créez-en un nouveau
virtualenv
, activez-le et installez les exigencesvirtualenv env && . env/bin/activate && pip install -r requirements.txt
Vous pouvez également utiliser virtualenvwrapper pour rendre les choses un peu plus faciles car toutes les virtualenv sont conservées dans un emplacement centralisé
la source
pip install -r requirements.txt
prend quelques heures (la compilation d'extensions C tierces sur raspberry pi).virtualenv env && pip install -r requirements.txt
n'installera PAS les exigences dans le nouvel environnement car vous ne l'activez pasvirtualenv-wrapper
moi-même utilisateur (qui s'active automatiquement à la création). J'ai mis à jour ma réponse pour inclure l'activation duvirtualenv
dans l'espoir d'éviter toute confusion.J'installe toujours virtualenvwrapper pour m'aider. À partir de l'invite du shell:
Il existe une méthode documentée dans les documents de virtualenvwrapper - cpvirtualenv C'est ce que vous faites. Assurez-vous que vous êtes hors de votre environnement et revenez à l'invite du shell. Tapez ceci avec les noms requis:
Et puis, si nécessaire:
Pour accéder à votre newenv:
la source
virtualenvwrapper
, pas seulementvirtualenv
. Cette réponse de @ryankdwyer est meilleure.Vous pouvez résoudre votre problème en suivant ces étapes:
$ virtualenv ..\path\renamed_directory
$ scripts/activate
$ pip freeze
pour vérifier que vos packages sont en placela source
--relocatable
, je pense que cette solution est meilleure que la réponse acceptée. Jusqu'à présent, j'ai remarqué que de nombreux.pyc
fichiers_new_name_/lib/python2.7
font toujours référence_old_name_
. Cependant, cela ne semble pas affecter le fonctionnement de mon environnement. Peut-être que la seule meilleure solution consiste à utiliservirtualenvwrapper
ou à certains des autres utilitaires mentionnés parmi les réponses ici. Au moins, cette solution ne nécessite pas l'installation de programmes supplémentaires.Une autre façon de le faire qui a fonctionné pour moi plusieurs fois sans problème est virtualenv-clone :
la source
(dans le dossier du projet)
N'oubliez pas de désactiver et d'activer
la source
sed -i "s|$old_dir|$new_dir|g" bin/*
sed -i '.original' 's/old_dir_name/new_dir_name/g' *
pour macsvirtualenv --relocatable ENV
n'est pas une solution souhaitable. Je suppose que la plupart des gens veulent pouvoir renommer un virtualenv sans aucun effet secondaire à long terme.J'ai donc créé un outil simple pour faire exactement cela. La page de projet de virtualenv-mv le décrit un peu plus en détail, mais vous pouvez essentiellement l'utiliser
virtualenv-mv
comme vous utiliseriez une implémentation simple demv
(sans aucune option).Par exemple:
Veuillez noter cependant que je viens de pirater cela. Il pourrait se briser dans des circonstances inhabituelles (par exemple, des virtualenvs liés par un lien symbolique) donc soyez prudent (sauvegardez ce que vous ne pouvez pas vous permettre de perdre) et faites-moi savoir si vous rencontrez des problèmes.
la source