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.txt
luego elimine el directorio y pip install -r requirements.txt
pero esto requiere mucha reinstalación de bibliotecas grandes, por ejemplo, numpy
que 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 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
ybin/python3
todavía vinculado a la antiguapython3.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 enENV_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
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
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
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 venv
no 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
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
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