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?
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.
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:
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'
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.
NOTE: Comme @jb. souligne, cette solution ne s'applique qu'aux virtualenv
s 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
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
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
Vous pouvez résoudre votre problème en procédant comme suit:
$ virtualenv ..\path\renamed_directory
$ scripts/activate
$ pip freeze
pour vérifier que vos paquets sont en placeUne 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
(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
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.