Mettre à niveau python dans un virtualenv


206

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

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 grandes bibliothèques, par exemple,numpy , que j'utilise beaucoup.

Je peux voir que c'est un avantage lors de la mise à niveau de, par exemple, 2.6 -> 2.7, mais qu'en est-il de 2.7.x -> 2.7.y?


2
Bien que vous puissiez modifier certains chemins, etc. pour le faire fonctionner. La dernière chose que vous voulez, c'est un environnement légèrement différent de la production. Pensez juste ... s'il y a même une différence entre la façon dont les différentes versions se compilent, vous allez perdre tout le temps économisé en traquant le bogue. Je prendrais juste le temps de créer un tout nouveau virtualenv et de tout réinstaller.
Sam Dolan

@Simon Walker. Exactement le même problème. Je dois mettre à jour python 3.5.3 pour une correction de bogue.
Mohammed Shareef C

Réponses:


77

Vous avez vu ça ? Si je n'ai pas mal compris cette réponse, vous pouvez essayer de créer un nouveau virtualenv au-dessus de l'ancien. Vous avez juste besoin de savoir quel python va utiliser 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 package virtualenv n'est pas une option, vous voudrez peut-être lire ceci afin d'installer un virtualenv avec la version python que vous souhaitez.

ÉDITER

J'ai testé cette approche (celle qui crée un nouveau virtualenv au-dessus de l'ancienne) et cela a bien fonctionné pour moi. Je pense que vous pouvez avoir des problèmes si vous passez de python 2.6 à 2.7 ou 2.7 à 3.x mais si vous mettez simplement à niveau à l'intérieur de 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 your_env / lib / python2.7 /).

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


13
Il ne voulait spécifiquement pas réinstaller les paquets si possible. Évidemment, vous n'avez jamais installé numpy depuis la source si vous ne savez pas pourquoi c'est important;) indice: cela prend un temps LOOOOOOOOOOOOOONG.
Antti Haapala

oui, je comprends ça. Mais il semble que s'il crée un virtualenv au dessus de l'autre, les packages ne sont pas perdus, il n'aura donc pas à réinstaller numpy ou tout autre package. Néanmoins, je pense qu'il devrait essayer ceci dans un nouveau virtualenv en cas d'échec.
marianobianchi

Je me repose, je pense que les nouvelles versions de virtualenv sont effectivement mises à niveau, mais pour les anciennes versions, elles n'ont même pas écrasé l'exécutable python, ce qui a causé des problèmes avec au moins une version de correction de bug python.
Antti Haapala

4
Cela n'a pas fonctionné pour moi et on dirait que ce n'est pas censé: github.com/pypa/virtualenv/issues/437
Kentzo

1
J'ai essayé d'en créer un nouveau virtualenven plus de l'ancien, et cela a fonctionné. Je devais spécifier -pde le pointer vers la bonne version de python.
osa

76

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

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

1
Malheureusement, cela ne fonctionne pas sur Ubuntu 16.04, où ils se sont cassés venvet refusent de le réparer sur la base que "vous pouvez simplement utiliser virtualenv". EDIT: en fait, ça marche! Il affiche également un message d'erreur sur "Ensurepip".
rspeer

2
J'ai mis à jour python de 3.5.1 à 3.6.4 sur mon système. Et pour mettre à niveau python sur mon virtualenv, j'ai dû mentionner explicitement python3.6 dans la commande:python3.6 -m venv --upgrade <path_of_existing_env>
Sarfraaz Ahmed

1
Dans mon cas, bin/pythonet bin/python3toujours lié à l'ancien python3.4binaire, et j'ai dû définir les liens manuellement. De plus, existe-t-il un moyen de supprimer la version python désormais obsolète?
Jens

4
J'ai obtenu Error: Command '['/Users/me/Sites/site/venv3/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1.> qu'est-ce que cela signifie? Je ne vois aucun processus Python actif, je ne peux pas mettre à niveau.
user305883

1
@ user305883 J'ai reçu une erreur similaire après avoir mis à niveau ma version Python système de 3.5 à 3.6 (et supprimé 3.5). J'ai dû réinstaller 3.5 et exécuter python3.6 -m venv --upgrade ENV_DIRpour que cela fonctionne. Je pense que je devrai encore mettre à jour certains liens symboliques ENV_DIR/bin. Par conséquent, l'astuce consistait à mettre à jour avec la nouvelle version Python alors que l'ancienne version était toujours installée.
AstroFloyd

24

Mis à jour à nouveau: la méthode suivante peut ne pas fonctionner dans les versions 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 avoir répondu à l'origine. La méthode suivante est plus pratique et robuste.

Effet secondaire: il corrige également l'Symbol not found: _SSLv2_methodexception lorsque vous le faitesimport ssldans un environnement virtuel après la mise à niveau de Python vers la v2.7.8.

Avis: À l' heure actuelle, ceci est pour Python 2.7.x seulement .


Si vous utilisez Homebrew Python sur OS X, tout d' deactivateabord 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 de base Python et les bibliothèques standard (plus setuptoolset pip) sont supprimés, tandis que les bibliothèques personnalisées installées danssite-packages sont conservé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 cela ./manage.py compilemessagesne fonctionne pas par la suite, essayez ceci:

brew install gettext && brew link gettext --force

Le seul fichier que j'ai dû supprimer était le bin/pythonfichier.
Koen.

Pour certaines anciennes versions de Python, la suppression setuptoolset pipest nécessaire.
Rockallite

1
J'ai également dû supprimer <EXISTING_ENV_PATH>/.Pythoncar cela a cassé la création de virtualenv.
Kiran Jonnalagadda

2
Sur la base de cette réponse, j'ai écrit un petit script (avec attribution complète): burgundywall.com/post/update-all-python-virtual-environments
Kurt

Vous pouvez réellement supprimer facilement votre environnement virtuel en exécutant rmvirtualenv <env_name>et supprimerez toutes ses dépendances alignées :) Voir plus sur: virtualenvwrapper.readthedocs.io/en/latest/…
Nick Lucas

7

Je n'ai pas pu créer un nouveau virtualenv par dessus l'ancien. Mais il y a des outils dans pip qui permettent de réinstaller les exigences beaucoup plus rapidement dans un tout nouveau venv. Pip peut construire chacun des éléments de votre requirements.txt dans un package de roue et le stocker dans un cache local. Lorsque vous créez un nouveau venv et exécutez l'installation de pip dedans, 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 je lancepip wheel -r requirements.txt . Cela stocke les roues construites dans le répertoire wheel dans mon pip.conf.

À partir de là, chaque fois que je pose une de ces exigences, il les installe à partir des roues, ce qui est assez rapide.


1
Pour la plupart des gens, je pense qu'il est logique d'utiliser des machines à pip pour faire le travail, mais pour quiconque a personnalisé leurs virtualenvs postactivate, predeactivate, etc., ce n'est pas une option souhaitable car tout ce qui est perdu et doit être relu manuellement.
dpwrussell

6

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

J'ajoute une réponse pour tous ceux qui utilisent l'excellent virtualenvwrapper de Doug Hellmann car les réponses existantes ne l'ont pas fait pour moi.

Un certain contexte:

  • Je travaille sur certains projets qui sont Python 2 et certains qui sont Python 3; même si j'adorerais l'utiliser python3 -m venv, il ne prend pas en charge les environnements Python 2
  • Lorsque je démarre un nouveau projet, j'utilise mkprojectce qui crée l'environnement virtuel, crée un répertoire de projet vide et y crée des CD
  • Je veux continuer à utiliser la workoncommande de virtualenvwrapper pour activer n'importe quel projet quelle que soit la version de Python

Instructions:

Supposons que votre projet existant porte un nom fooet exécute actuellement Python 2 ( mkproject -p python2 foo), bien que les commandes soient les mêmes, que vous passiez de 2.x à 3.x, 3.6.0 à 3.6.1, etc. Je suppose également que vous ' re actuellement à l'intérieur de 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 crochets (par exemple, bin/postactivate) vous devez les enregistrer avant de supprimer l'environnement.

2. Cachez le vrai projet 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 du projet généré vide par le projet réel, revenez au répertoire du 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, je vais envisager d'ouvrir un PR pour ajouter quelque chose comme $ upgradevirtualenv/ $ upgradeprojectà virtualenvwrapper.


1
Oui s'il vous plaît. Je suis arrivé à mi-chemin et j'ai eu des problèmes majeurs ... Un chèque serait bien parce que la première étape est irréversible une fois supprimée (à ma connaissance actuelle)
chris Frisina

2

Cette approche fonctionne toujours pour moi:

# First of all, delete all broken links. Replace  my_project_name` to your virtual env name
find ~/.virtualenvs/my_project_name/ -type l -delete
# Then create new links to the current Python version
virtualenv ~/.virtualenvs/my_project_name/
# It's it. Just repeat for each virtualenv located in ~/.virtualenvs

Pris à partir de:


1

J'ai déplacé mon répertoire personnel d'un Mac à un autre (Mountain Lion à Yosemite) et je ne me suis pas rendu compte du virtualenv cassé jusqu'à ce que je perde le contrôle de l'ancien ordinateur portable. J'ai fait installer le point virtualenv vers Python 2.7 brewet depuis que Yosemite est venu avec Python 2.7, je voulais mettre à jour mon virtualenv vers le système python. Lorsque j'ai couru virtualenvau-dessus du répertoire existant, j'obtenais une OSError: [Errno 17] File exists: '/Users/hdara/bin/python2.7/lib/python2.7/config'erreur. Par essais et erreurs, j'ai contourné ce problème en supprimant quelques liens et en corrigeant quelques autres manuellement. C'est ce que j'ai finalement fait (similaire à ce que @Rockalite a fait, mais plus simple):

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 simplement exécuter virtualenv sur le répertoire existant.


1

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

J'ai enregistré ce qui suit dans upgrade_python3.sh donc je me souviens combien de mois à partir de maintenant quand je dois le faire à nouveau:

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

MISE À JOUR: alors que cela semblait bien fonctionner au début, lorsque j'ai exécuté py.test, cela a donné une erreur. Au final, je viens de recréer l'environnement à partir d'un fichier d'exigences.


py.testne fonctionne pas car `~ / .virtualenvs / myenv / bin / python3.7 n'est pas un lien symbolique, donc ne se met pas à jour.
Ash Berlin-Taylor

Ah en fait, le problème est qu'il y a ~/.virtualenvs/myenv/.Pythonun lien symbolique.
Ash Berlin-Taylor

1

Si vous utilisez pipenv, je ne sais pas s'il est possible de mettre à niveau un environnement en 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
>>>

impressionnant! Merci pour ce bijou
Mayur Patil

1

Je veux juste clarifier, parce que certaines des réponses se réfèrent venvet d'autres se réfèrent virtualenv.

L'utilisation de l' indicateur -pou --pythonest prise en charge virtualenv, mais pas activée venv. Si vous avez plusieurs versions de Python et que vous souhaitez spécifier celle avec laquelle créer le venv, faites-le sur la ligne de commande, comme ceci:

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

Vous pouvez bien sûr mettre à niveau avec venvcomme d'autres l'ont souligné, mais cela suppose que vous avez déjà mis à niveau le Python qui a été utilisé pour créer cela venven premier lieu. Vous ne pouvez pas mettre à niveau vers une version Python que vous n'avez pas déjà sur votre système quelque part, alors assurez-vous d'obtenir la version que vous voulez, d'abord, puis faites-en tous les vénvs que vous voulez.


1

Étape 1: Gel des exigences et sauvegarde de l'environnement existant

pip freeze > requirements.txt
deactivate
mv env env_old

Étape 2: installer Python 3.7 et activer l'environnement virutal

sudo apt-get install python3.7-venv
python3.7 -m venv env
source env/bin/activate
python --version

Étape 3: installer les exigences

sudo apt-get install python3.7-dev
pip3 install -r requirements.txt

0

Pour tous ceux qui ont le problème

Erreur: la commande '[' / Users / me / Sites / site / venv3 / bin / python3 ',' -Im ',' Ensurepip ',' --upgrade ',' --default-pip ']' a renvoyé une valeur non nulle état de sortie 1.

Vous devez installer python3.6-venv

 sudo apt-get install python3.6-venv
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.