Actualice Python en un entorno virtual

11 minutos de lectura

Avatar de usuario de Simon Walker
Simón Walker

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

pude pip freeze --local > requirements.txtluego elimine el directorio y pip install -r requirements.txtpero esto requiere mucha reinstalación de bibliotecas grandes, por ejemplo, numpyque uso mucho.

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

  • Si bien es posible que pueda modificar algunas rutas, etc. para que funcione. Lo último que desea es un entorno ligeramente diferente al de producción. Solo piense… si hay una sola diferencia entre cómo se compilan las distintas versiones, perderá todo el tiempo ahorrado al rastrear el error. Simplemente me tomaría el tiempo para crear un virtualenv completamente nuevo y reinstalar todo.

    – Sam Dolan

    15 de junio de 2012 a las 22:10

  • @Simón Walker. Exactamente el mismo problema. Tengo que actualizar Python 3.5.3 para corregir un error.

    – Mohammed Shareef C.

    19 de julio de 2017 a las 9:54

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

Actualice el directorio del entorno para usar esta versión de Python, suponiendo que Python se haya actualizado en el lugar

python3 -m venv --upgrade ENV_DIR

  • Actualicé Python de 3.5.1 a 3.6.4 en mi sistema. Y para actualizar python en mi virtualenv, tuve que mencionar explícitamente python3.6 en el comando: python3.6 -m venv --upgrade <path_of_existing_env>

    – Sarfraaz Ahmed

    04/01/2018 a las 18:34


  • El --upgrade flag no es necesario en mi experiencia (3.5.2 a 3.5.4 en Windows/Git Bash).

    –Scott Stevens

    10 de enero de 2018 a las 7:25

  • En mi caso, bin/python y bin/python3 todavía vinculado a la antigua python3.4 binario, y tuve que configurar los enlaces manualmente. Además, ¿hay alguna manera de eliminar la versión de python ahora desactualizada?

    – Jens

    30 de abril de 2018 a las 8:03

  • Obtuve Error: Command '['/Users/me/Sites/site/venv3/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1. > que significa? No veo procesos de python activos, no puedo actualizar.

    – usuario305883

    4 de noviembre de 2018 a las 9:44

  • @ user305883 Recibí un error similar después de actualizar la versión de Python de mi sistema de 3.5 a 3.6 (y eliminé 3.5). Tuve que reinstalar 3.5 y ejecutar python3.6 -m venv --upgrade ENV_DIR para que funcione. Creo que todavía tendré que actualizar algunos enlaces simbólicos en ENV_DIR/bin. Por lo tanto, el truco estaba en actualizar con el nuevo Versión de Python mientras la versión anterior aún estaba instalada.

    – AstroFloyd

    25 de febrero de 2019 a las 20:41


avatar de usuario de marianobianchi
marianobianchi

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

Si su virtualenv está instalado con la misma versión de python que la anterior y actualizar su paquete virtualenv no es una opción, es posible que desee leer esto para instalar un virtualenv con la versión de python que desea.

EDITAR

Probé este enfoque (el que crea un nuevo virtualenv encima del 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 solo actualiza dentro de la misma versión (manteniéndose en 2.7 como desee) no debería tener ningún problema, ya que todos los paquetes se mantienen en las mismas carpetas para ambas versiones de python (los paquetes 2.7.x y 2.7.y están dentro de your_env/lib/python2.7/).

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

  • Específicamente, no quería reinstalar ningún paquete si era posible. Obviamente, nunca ha instalado numpy desde la fuente si no sabe por qué es importante;) pista: toma MUCHO tiempo.

    – Antti Haapala — Слава Україні

    16 de junio de 2012 a las 20:16

  • si, lo entiendo Pero parece que si hace un entorno virtual encima del otro, los paquetes no se pierden, por lo que no tendrá que reinstalar numpy ni ningún otro paquete. Sin embargo, creo que debería probar esto en un nuevo virtualenv en caso de que falle.

    – marianobianchi

    16 de junio de 2012 a las 20:33

  • Descanso, creo que las nuevas versiones de virtualenv sí se actualizan en su lugar, sin embargo, para las versiones anteriores, ni siquiera sobrescribieron el ejecutable de python, lo que causó problemas con al menos una versión de corrección de errores de python.

    – Antti Haapala — Слава Україні

    17 de junio de 2012 a las 9:42

  • No funcionó para mí y parece que no debería: github.com/pypa/virtualenv/issues/437

    – Kentzo

    20 de julio de 2013 a las 7:07

  • Traté de crear una nueva virtualenv encima del viejo, y hizo trabajar. tenia que especificar -p para apuntarlo a la versión correcta de python.

    – Serguéi Orshanskiy

    4 de noviembre de 2013 a las 3:01

Paso 1: Congelar el requisito y realizar una copia de seguridad del entorno existente

pip freeze > requirements.txt
deactivate
mv env env_old

Paso 2: Instale Python 3.7 y active el entorno virtual

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

Paso 3: Requisitos de instalación

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

Avatar de usuario de Rockallite
Rockalita

Actualizado de nuevo:

El siguiente método podría no funcionar en versiones más nuevas de virtualenv. Antes de intentar realizar modificaciones en el entorno virtual anterior, debe guardar las dependencias en un archivo de requisitos (pip freeze > requirements.txt) y haga una copia de seguridad en otro lugar. Si algo sale mal, aún puede crear un nuevo virtualenv e instalar las antiguas dependencias en él (pip install -r requirements.txt).

Actualizado: Cambié la respuesta 5 meses después de haber respondido originalmente. El siguiente método es más conveniente y robusto.

Efecto secundario: también arregla el Symbol not found: _SSLv2_method excepción cuando lo haces 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á usando Homebrew Python en OS X, primero deactivate todo virtualenv, luego actualice Python:

brew update && brew upgrade python

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

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

Finalmente, vuelva a crear su entorno virtual:

virtualenv <EXISTING_ENV_PATH>

Al hacerlo, los antiguos archivos principales de Python y las bibliotecas estándar (más setuptools y pip) se eliminan, 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 necesitar ser reinstaladas para funcionar correctamente.

Esto funcionó para mí 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

Avatar de usuario de Taylor D. Edmiston
Taylor D Edmiston

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 envoltorio virtual específicamente porque las respuestas existentes no lo hicieron por mí.

Algo de contexto:

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

Direcciones:

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

1. Desactive y elimine el antiguo entorno virtual:

$ deactivate
$ rmvirtualenv foo

Tenga en cuenta que si ha agregado comandos personalizados a los ganchos (p. ej., bin/postactivate) necesitaría guardarlos antes de eliminar el entorno.

2. Guarde el proyecto real en un directorio temporal:

$ cd ..
$ mv foo foo-tmp

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

$ mkproject -p python3 foo

4. Reemplace el directorio del proyecto generado vacío con el proyecto real, vuelva a cambiar 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.

  • Sí, por favor. Llegué a la mitad de esto y tuve problemas importantes … Sería bueno verificar porque el primer paso es irreversible una vez eliminado (hasta donde sé)

    – Chris Frisina

    20 de marzo de 2020 a las 4:59

  • Me pareció necesario instalar también distutils para mi versión de python para garantizar que el nuevo comando mkvirtualenv funcionara sin errores: sudo apt-get install python3.10-distutils

    – Ken Buckley

    23 de marzo de 2022 a las 9:57

Consideremos que el entorno que se quiere actualizar tiene el nombre venv.

1. Requisitos de proveedores de respaldo (opcional)

En primer lugar, haga una copia de seguridad de los requisitos del entorno virtual:

pip freeze > requirements.txt
deactivate
#Move the folder to a new one
mv venv venv_old

2. Instalar Python

Asumiendo que uno no tiene acceso a Sudo, pyenv es una forma confiable y rápida de instalar Python. Para eso, uno debe correr

curl https://pyenv.run | bash

y luego

exec $SHELL

como sugerido aquí.

Si, cuando uno intenta actualizar pyenv

pyenv update

y uno obtiene el error

bash: pyenv: command not found

eso es porque pyenv la ruta no se exportó a .bashrc. Se puede solucionar ejecutando los siguientes comandos:

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bashrc

Luego reinicie el shell

exec "$SHELL"

Ahora uno debe instalar la versión de Python que quiera. Digamos la versión 3.8.3

pyenv install 3.8.3

Se puede confirmar si se instaló correctamente ejecutando

pyenv versions

El resultado debe ser la ubicación y las versiones (en este caso, 3.8.3)

3. Crear el nuevo entorno virtual

Finalmente, con la nueva versión de Python instalada, cree un nuevo entorno virtual (llamémoslo venv)

python3.8 -m venv venv

activarlo

source venv/bin/activate

e instalar los requisitos

pip install -r requirements.txt

Ahora uno debería estar en funcionamiento con un nuevo entorno.

  • Sí, por favor. Llegué a la mitad de esto y tuve problemas importantes … Sería bueno verificar porque el primer paso es irreversible una vez eliminado (hasta donde sé)

    – Chris Frisina

    20 de marzo de 2020 a las 4:59

  • Me pareció necesario instalar también distutils para mi versión de python para garantizar que el nuevo comando mkvirtualenv funcionara sin errores: sudo apt-get install python3.10-distutils

    – Ken Buckley

    23 de marzo de 2022 a las 9:57

Avatar de usuario de Russ Egan
Russ Egan

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 un nuevo venv. Pip puede construir cada uno de los elementos en su requirements.txt en un paquete de rueda y almacenarlo en un caché local. Cuando crea un nuevo venv y ejecuta pip install en él, pip usará automáticamente las ruedas preconstruidas si las encuentra. Wheels se instala mucho más rápido que ejecutar setup.py para cada módulo.

Mi ~/.pip/pip.conf se ve así:

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

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

instalo rueda (pip install wheel), entonces corre pip wheel -r requirements.txt. Esto almacena las ruedas construidas en el directorio de ruedas en mi pip.conf.

A partir de ese momento, cada vez que instale alguno de estos requisitos, los instalará desde las ruedas, lo cual es bastante rápido.

  • Para la mayoría de las personas, creo que tiene sentido utilizar la maquinaria pip para hacer el trabajo, pero para cualquiera que haya personalizado sus virtualenvs postactivate, predeactivate, etc., esta no es una opción deseable porque todo eso se pierde y tiene que ser leído manualmente.

    – dpwr

    18/04/2016 a las 17:26

¿Ha sido útil esta solución?