web-dev-qa-db-fra.com

Mettre à niveau python dans une virtualenv

Existe-t-il un moyen de mettre à niveau la version de python utilisée dans virtualenv (par exemple, si une version de correction de bogues est publiée)?

Je pourrais pip freeze --local > requirements.txt, puis supprimer le répertoire et pip install -r requirements.txt, mais cela nécessite beaucoup de réinstallation de bibliothèques volumineuses, par exemple, numpy, que j'utilise beaucoup. 

Je constate que c'est un avantage lors de la mise à niveau à partir de 2,6 -> 2,7, par exemple, mais qu'en est-il de la version 2.7.x -> 2.7.y?

147
Simon Walker

Avez-vous vu ceci ? Si je ne vous ai pas mal compris, vous pouvez essayer de créer un nouveau fichier virtuel par-dessus l'ancien. Vous devez juste savoir quel python utilisera votre virtualenv (vous aurez besoin de voir votre version de virtualenv). 

Si votre virtualenv est installé avec la même version python de l'ancienne et que la mise à niveau de votre paquet virtualenv n'est pas une option, vous pouvez lire this afin d'installer un virtualenv avec la version python souhaitée.

MODIFIER

J'ai testé cette approche (celle qui crée une nouvelle virtualenv par-dessus l'ancienne) et elle a bien fonctionné pour moi. Je pense que vous pourriez avoir des problèmes si vous passez de python 2.6 à 2.7 ou 2.7 à 3.x, mais si vous mettez à niveau dans la même version (en restant à 2.7 comme vous le souhaitez), vous ne devriez pas avoir de problème, car tous les packages sont conservés dans les mêmes dossiers pour les deux versions de python (les packages 2.7.x et 2.7.y se trouvent dans votre_env/lib/python2.7 /).

Si vous modifiez votre version de virtualenv python, vous devrez réinstaller tous vos packages pour cette version (ou lier simplement les packages dont vous avez besoin dans le nouveau dossier des packages de version, par exemple, votre_env/lib/python_newversion/site-packages).

60
marianobianchi

Si vous utilisez le module venv fourni avec Python 3.3+, il prend en charge une option --upgrade. Selon les docs :

Mettez à niveau le répertoire d'environnement pour utiliser cette version de Python, en supposant que Python a été mis à niveau sur place

python3 -m venv --upgrade ENV_DIR
44
CoupleWavyLines

Mise à jour à nouveau:.__ La méthode suivante pourrait ne pas fonctionner dans les versions les plus récentes de virtualenv. Avant d'essayer d'apporter des modifications à l'ancien virtualenv, vous devez enregistrer les dépendances dans un fichier d'exigences (pip freeze > requirements.txt) et en faire une sauvegarde ailleurs. En cas de problème, vous pouvez toujours créer un nouveau virtualenv et y installer les anciennes dépendances (pip install -r requirements.txt).

Mise à jour:J'ai changé la réponse 5 mois après ma réponse initiale. La méthode suivante est plus pratique et robuste.

Effet secondaire:il corrige également l'exception Symbol not found: _SSLv2_method lorsque vous effectuez import ssl dans un environnement virtuel après la mise à niveau de Python vers la version 2.7.8.

Remarque:Actuellement, ceci concerne uniquement Python 2.7.x .


Si vous utilisez Homebrew Python sur OS X, commencez par deactivate tout virtualenv, puis mettez à niveau Python:

brew update && brew upgrade python

Exécutez les commandes suivantes (<EXISTING_ENV_PATH> est le chemin de votre environnement virtuel):

cd <EXISTING_ENV_PATH>
rm .Python
rm bin/pip{,2,2.7}
rm bin/python{,2,2.7}
rm -r include/python2.7
rm lib/python2.7/*
rm -r lib/python2.7/distutils
rm lib/python2.7/site-packages/easy_install.*
rm -r lib/python2.7/site-packages/pip
rm -r lib/python2.7/site-packages/pip-*.dist-info
rm -r lib/python2.7/site-packages/setuptools
rm -r lib/python2.7/site-packages/setuptools-*.dist-info

Enfin, recréez votre environnement virtuel:

virtualenv <EXISTING_ENV_PATH>

Ce faisant, les anciens fichiers Python Core et les bibliothèques standard (plus setuptools et pip) sont supprimés, tandis que les bibliothèques personnalisées installées dans site-packages sont préservées et fonctionnent dès qu'elles sont en Python pur. Les bibliothèques binaires peuvent ou non avoir besoin d'être réinstallées pour fonctionner correctement.

Cela a fonctionné pour moi sur 5 environnements virtuels avec Django installé.

BTW, si ./manage.py compilemessages ne fonctionne pas après, essayez ceci:

brew install gettext && brew link gettext --force
22
Rockallite

Je n'ai pas pu créer une nouvelle virtualenv par-dessus l'ancienne. Mais il existe des outils dans pip qui permettent beaucoup plus rapidement de réinstaller les exigences dans un tout nouveau système. Pip peut créer chacun des éléments de votre Requirements.txt dans un package Wheel et le stocker dans un cache local. Lorsque vous créez un nouveau disque venv et que vous y installez pip install, pip utilisera automatiquement les roues prédéfinies s’il les trouve. Les roues s’installent beaucoup plus rapidement que l’exécution de setup.py pour chaque module.

Mon ~/.pip/pip.conf ressemble à ceci:

[global]
download-cache = /Users/me/.pip/download-cache
find-links =
/Users/me/.pip/wheels/

[wheel]
wheel-dir = /Users/me/.pip/wheels

J'installe wheel (pip install wheel), puis lance pip wheel -r requirements.txt. Cela stocke les roues construites dans le répertoire de mon pip.conf.

À partir de ce moment-là, chaque fois que j'installe l'une de ces exigences, il les installe à partir des roues, ce qui est rapide. 

5
Russ Egan

Comment mettre à niveau la version Python d'un projet virtualenvwrapper existant et conserver le même nom

J'ajoute une réponse à quiconque utilise l'excellent virtualenvwrapper de Doug Hellmann, étant donné que les réponses existantes ne me l'ont pas apporté.

Un peu de contexte:

  • Je travaille sur des projets Python 2 et Python 3; bien que j'aimerais utiliser python3 -m venv, il ne prend pas en charge les environnements Python 2
  • Quand je commence un nouveau projet, j'utilise mkproject qui crée l'environnement virtuel, crée un répertoire de projet vide et y cd
  • Je souhaite continuer à utiliser la commande workon de virtualenvwrapper pour activer tout projet, quelle que soit la version de Python.

Instructions:

Supposons que votre projet existant s'appelle foo et exécute actuellement Python 2 (mkproject -p python2 foo), bien que les commandes soient les mêmes que vous utilisiez une mise à niveau de 2.x à 3.x, 3.6.0 à 3.6.1, etc. Je suppose également vous êtes actuellement dans l'environnement virtuel activé.

1. Désactivez et supprimez l'ancien environnement virtuel:

$ deactivate
$ rmvirtualenv foo

Notez que si vous avez ajouté des commandes personnalisées aux points d'ancrage (par exemple, bin/postactivate), vous devez les enregistrer avant de supprimer l'environnement.

2. Rangez le projet réel dans un répertoire temporaire:

$ cd ..
$ mv foo foo-tmp

3. Créez le nouvel environnement virtuel (et le répertoire du projet) et activez:

$ mkproject -p python3 foo

4. Remplacez le répertoire de projet généré vide par le projet réel, puis revenez dans le répertoire de projet:

$ cd ..
$ mv -f foo-tmp foo
$ cdproject

5. Réinstallez les dépendances, confirmez la nouvelle version de Python, etc.:

$ pip install -r requirements.txt
$ python --version

S'il s'agit d'un cas d'utilisation courant, nous envisagerons d'ouvrir un PR afin d'ajouter quelque chose comme $ upgradevirtualenv/$ upgradeproject à virtualenvwrapper.

3
Taylor Edmiston

Sous OS X ou macOS utilisant Homebrew pour installer et mettre à niveau Python3, je devais supprimer les liens symboliques avant que python -m venv --upgrade ENV_DIR ne fonctionne.

J'ai enregistré les éléments suivants dans upgrade_python3.sh afin que je me souvienne des mois à partir desquels je dois le refaire:

brew upgrade python3
find ~/.virtualenvs/ -type l -delete
find ~/.virtualenvs/ -type d -mindepth 1 -maxdepth 1 -exec python3 -m venv --upgrade "{}" \;

MISE À JOUR: bien que cela ait semblé bien fonctionner au début, lorsque j'ai lancé py.test, cela a donné une erreur. En fin de compte, je viens de recréer l'environnement à partir d'un fichier d'exigences.

1
Jeff C Johnson

Je tiens simplement à préciser, car certaines des réponses font référence à venv et d’autres à virtualenv.

L'utilisation de l'indicateur -p ou --python est prise en charge sur virtualenv, mais pas sur venv. Si vous avez plusieurs versions de Python et que vous voulez spécifier celle avec laquelle créer la variable venv, faites-le sur la ligne de commande, comme suit:

malikarumi@Tetuoan2:~/Projects$ python3.6 -m venv {path to pre-existing dir you want venv in}

Vous pouvez bien sûr mettre à niveau avec venv comme d'autres l'ont fait remarquer, mais cela suppose que vous avez déjà mis à niveau le Python utilisé pour créer cette venv à la base. Vous ne pouvez pas passer à une version Python que vous n’avez pas déjà sur votre système, alors assurez-vous d’obtenir la version que vous voulez, d’abord, puis créez tous les effets que vous voulez.

1
Malik A. Rumi

Si vous utilisez pipenv, je ne sais pas s'il est possible de mettre à niveau un environnement sur place, mais au moins pour les mises à niveau de versions mineures, il semble être assez intelligent pour ne pas reconstruire les packages à partir de zéro lorsqu'il crée un nouvel environnement. Par exemple, de 3.6.4 à 3.6.5:

$ pipenv --python 3.6.5 install
Virtualenv already exists!
Removing existing virtualenv…
Creating a v$ pipenv --python 3.6.5 install
Virtualenv already exists!
Removing existing virtualenv…
Creating a virtualenv for this project…
Using /usr/local/bin/python3.6m (3.6.5) to create virtualenv…
⠋Running virtualenv with interpreter /usr/local/bin/python3.6m
Using base prefix '/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6'
New python executable in /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/python3.6
Also creating executable in /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/python
Installing setuptools, pip, wheel...done.

Virtualenv location: /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD
Installing dependencies from Pipfile.lock (84dd0e)…
  ????   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 47/47 — 00:00:24
To activate this project's virtualenv, run the following:
 $ pipenv Shell
$ pipenv Shell
Spawning environment Shell (/bin/bash). Use 'exit' to leave.
. /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/activate
bash-3.2$ . /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/activate
(autoscale-aBUhewiD) bash-3.2$ python
Python 3.6.5 (default, Mar 30 2018, 06:41:53) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>>
1
David Moles

J'ai déplacé mon répertoire personnel d'un ordinateur à un autre (Mountain Lion à Yosemite) et je ne me rendais pas compte de la virtualisation brisée jusqu'à ce que j'ai perdu le contrôle de l'ancien ordinateur portable. J'avais le point virtualenv sur Python 2.7 installé par brew et, comme Yosemite est venu avec Python 2.7, je souhaitais mettre à jour mon virtualenv sur le système python. Lorsque j’ai exécuté virtualenv au-dessus du répertoire existant, j’obtenais une erreur OSError: [Errno 17] File exists: '/Users/hdara/bin/python2.7/lib/python2.7/config'. Par essais et erreurs, j’ai corrigé ce problème en supprimant quelques liens et en en réparant un plus manuellement. Voici ce que j’ai finalement fait (comme @Rockalite, mais plus simplement):

cd <virtualenv-root>
rm lib/python2.7/config
rm lib/python2.7/lib-dynload
rm include/python2.7
rm .Python
cd lib/python2.7
gfind . -type l -xtype l | while read f; do ln -s -f /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/${f#./} $f; done

Après cela, j’ai pu exécuter virtualenv par-dessus le répertoire existant.

1
haridsv

Pour tout le monde avec le problème

Erreur: La commande '['/Utilisateurs/moi/Sites/site/venv3/bin/python3 ',' -Im ',' Ensurepip ',' --upgrade ',' --default-pip ']' a renvoyé une valeur autre que zéro état de sortie 1.

Vous devez installer python3.6-venv

 Sudo apt-get install python3.6-venv
0
JanL