Actualizar python en un virtualenv

¿Hay alguna manera de actualizar la versión de python utilizada en un virtualenv (por ejemplo, si sale una versión de corrección de errores)?

Podría pip freeze --local > requirements.txt , luego eliminar el directorio y pip install -r requirements.txt pip freeze --local > requirements.txt , pero esto requiere una gran cantidad de reinstalación de bibliotecas grandes, por ejemplo, numpy , que uso mucho.

Puedo ver que esto es una ventaja al actualizar desde, por ejemplo, 2.6 -> 2.7, pero ¿qué pasa con 2.7.x -> 2.7.y?

¿Viste esto ? Si no he entendido mal esa respuesta, puede intentar crear un nuevo virtualv encima del anterior. Solo necesitas saber qué python usará tu virtualenv (necesitarás ver tu versión de virtualenv).

Si su virtualenv se instala con la misma versión de python de la anterior y la actualización de su paquete de virtualenv no es una opción, puede leer esto para instalar un virtualenv con la versión de python que desea.

EDITAR

He probado este enfoque (el que crea un nuevo virtualenv sobre el anterior) y funcionó bien para mí. Creo que puede tener algunos problemas si cambia de Python 2.6 a 2.7 o 2.7 a 3.x, pero si simplemente actualiza dentro de la misma versión (manteniéndose en 2.7 como quiera) no debería tener ningún problema, ya que todos los paquetes se mantienen en las mismas carpetas para las dos versiones de python (los paquetes 2.7.xy 2.7.y están dentro de your_env / lib / python2.7 /).

Si cambia su versión de python virtualenv, deberá instalar todos los paquetes nuevamente para esa versión (o simplemente vincular los paquetes que necesita a la nueva carpeta de paquetes de versión, es decir: your_env / lib / python_newversion / site-packages)

Si está utilizando el módulo venv que viene con Python 3.3+, es compatible con la opción --upgrade . Por los documentos :

Actualice el directorio de entorno para usar esta versión de Python, asumiendo que Python se ha actualizado in situ

 python3 -m venv --upgrade ENV_DIR 

Actualizado nuevamente: es posible que el siguiente método no funcione en versiones más nuevas de virtualenv. Antes de intentar realizar modificaciones en el virtualenv anterior, debe guardar las dependencias en un archivo de requisitos ( pip freeze > requirements.txt ) y hacer una copia de seguridad en otro lugar. Si algo sale mal, aún puede crear un nuevo virtualenv e instalar las dependencias antiguas en él ( pip install -r requirements.txt ).

Actualizado: cambié la respuesta 5 meses después de la respuesta original. El siguiente método es más conveniente y robusto.

Efecto colateral: también corrige el Symbol not found: _SSLv2_method excepción cuando import ssl en un entorno virtual después de actualizar Python a v2.7.8.

Aviso: Actualmente, esto es solo para Python 2.7.x.


Si está utilizando Homebrew Python en OS X, primero deactivate todo virtualenv, luego actualice Python:

 brew update && brew upgrade python 

Ejecute los siguientes comandos ( es la ruta de su entorno virtual):

 cd  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 

Finalmente, vuelve a crear tu entorno virtual:

 virtualenv  

Al hacerlo, se eliminan los antiguos archivos básicos de Python y las bibliotecas estándar (más setuptools y pip ), mientras que las bibliotecas personalizadas instaladas en site-packages se conservan y funcionan, tan pronto como están en Python puro. Las bibliotecas binarias pueden o no necesitan ser reinstaladas para funcionar correctamente.

Esto me funcionó en 5 entornos virtuales con Django instalado.

Por cierto, si ./manage.py compilemessages no funciona después, intente esto:

 brew install gettext && brew link gettext --force 

No pude crear un nuevo virtualenv encima del anterior. Pero hay herramientas en pip que hacen que sea mucho más rápido reinstalar los requisitos en una nueva versión de venv. Pip puede crear cada uno de los elementos en tu Requirements.txt en un paquete de rueda y almacenarlo en un caché local. Cuando creas un nuevo venv y ejecutas pip install en él, pip utilizará automáticamente las ruedas precomstackdas si las encuentra. Las ruedas se instalan mucho más rápido que la ejecución de setup.py para cada módulo.

Mi ~ / .pip / pip.conf tiene este aspecto:

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

Instalo la rueda ( pip install wheel ), luego ejecuto pip wheel -r requirements.txt . Esto almacena las ruedas construidas en el directorio de ruedas en mi pip.conf.

A partir de entonces, cada vez que instalo cualquiera de estos requisitos, los instala desde las ruedas, lo cual es bastante rápido.

Cómo actualizar la versión de Python para un proyecto virtualenvwrapper existente y mantener el mismo nombre

Estoy agregando una respuesta para cualquiera que use el excelente virtualenvwrapper de Doug Hellmann específicamente ya que las respuestas existentes no lo hicieron por mí.

Algún contexto:

  • Trabajo en algunos proyectos que son Python 2 y algunos que son Python 3; aunque me encantaría usar python3 -m venv , no es compatible con los entornos Python 2
  • Cuando comienzo un nuevo proyecto, uso mkproject que crea el entorno virtual, crea un directorio de proyecto vacío y cds en él
  • Quiero continuar usando el comando workon de virtualenvwrapper para activar cualquier proyecto independientemente de la versión de Python

Direcciones:

Digamos que su proyecto existente se llama foo y actualmente ejecuta Python 2 ( mkproject -p python2 foo ), aunque los comandos son los mismos ya sea que se actualicen de 2.x a 3.x, 3.6.0 a 3.6.1, etc. También asumo que actualmente estás dentro del entorno virtual activado.

1. Desactive y elimine el entorno virtual antiguo:

 $ deactivate $ rmvirtualenv foo 

Tenga en cuenta que si ha agregado comandos personalizados a los ganchos (por ejemplo, bin/postactivate ), deberá guardarlos antes de eliminar el entorno.

2. Guarda el proyecto real en un directorio temporal:

 $ cd .. $ mv foo foo-tmp 

3. Cree el nuevo entorno virtual (y dirija el proyecto) y active:

 $ mkproject -p python3 foo 

4. Reemplace el directorio del proyecto generado vacío con el proyecto real, cambie nuevamente al directorio del proyecto:

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

5. Vuelva a instalar las dependencias, confirme la nueva versión de Python, etc.

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

Si este es un caso de uso común, consideraré abrir un PR para agregar algo como $ upgradevirtualenv / $ upgradeproject a virtualenvwrapper.

Trasladé el directorio de mi casa de una mac a otra (Mountain Lion to Yosemite) y no me di cuenta de la virtualidad rota hasta que perdí la computadora portátil. Tuve el punto virtualenv para Python 2.7 instalado por brew y, como Yosemite vino con Python 2.7, quería actualizar mi virtualenv al sistema python. Cuando ejecuté virtualenv en la parte superior del directorio existente, recibía OSError: [Errno 17] File exists: '/Users/hdara/bin/python2.7/lib/python2.7/config' error. Por prueba y error, resolví este problema eliminando algunos enlaces y arreglando algunos más manualmente. Esto es lo que finalmente hice (similar a lo que hizo @Rockalite, pero más simple):

 cd  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 

Después de esto, pude ejecutar virtualenv encima del directorio existente.

En OS X o macOS utilizando Homebrew para instalar y actualizar Python3 tuve que eliminar enlaces simbólicos antes de que python -m venv --upgrade ENV_DIR funcionara.

Guardé lo siguiente en upgrade_python3.sh, así que recordaría en qué meses a partir de ahora debo hacerlo de nuevo:

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

ACTUALIZACIÓN: aunque esto pareció funcionar bien al principio, cuando ejecuté py.test dio un error. Al final acabo de recrear el entorno a partir de un archivo de requisitos.

Si está utilizando pipenv , no sé si es posible actualizar un entorno en su lugar, pero al menos para las actualizaciones de versiones menores parece ser lo suficientemente inteligente como para no reconstruir paquetes desde cero cuando crea un nuevo entorno. Por ejemplo, de 3.6.4 a 3.6.5:

 $ pipenv --python 3.6.5 install Virtualenv already exists! Removing existing virtualenv… Creating av$ 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 >>> 

Solo quiero aclarar, porque algunas de las respuestas se refieren a venv y otras se refieren a virtualenv .

El uso del indicador -p o --python se admite en virtualenv , pero no en venv . Si tiene más de una versión de Python y desea especificar con cuál crear el venv , hágalo en la línea de comandos, como esto:

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

Por supuesto, puede actualizar con venv como han señalado otros, pero eso supone que ya ha actualizado el Python que se utilizó para crear ese venv en primer lugar. No puedes actualizar a una versión de Python que no tengas en tu sistema en algún lugar, así que asegúrate de obtener la versión que deseas, primero, y luego haz todos los venvs que quieras.

Para todos los que tienen el problema.

Error: el comando ‘[‘ / Users / me / Sites / site / venv3 / bin / python3 ‘,’ -Im ‘,’ ensurepip ‘,’ –upgrade ‘,’ –default-pip ‘]’ devuelto no es cero Estado de salida 1.

Tienes que instalar python3.6-venv

  sudo apt-get install python3.6-venv