Cómo administrar múltiples versiones de Python y entornos virtuales

Adición de enero de 2019: si regresa a este blog después de actualizar a macOS Mojave, consulte este problema de github para obtener una solución al problema común de pyenv 'zlib no disponible'.

Antes de comenzar, repasemos brevemente los términos utilizados en el título:

  • Varias versiones de Python : diferentes instalaciones de Python en la misma máquina, 2.7 y 3.4 por ejemplo.
  • Entornos virtuales : entornos independientes aislados que pueden tener tanto una versión específica de Python como de cualquier paquete específico del proyecto instalado dentro de ellos, sin afectar a ningún otro proyecto.

Aquí veremos tres herramientas diferentes para trabajar con ellos y cuándo podría necesitar cada una. Exploremos los casos de uso para:

  • venv / pyvenv
  • pyenv
  • pyenv-virtualenv

Si está utilizando una única versión de Python, digamos versión 3.3+ , y desea administrar diferentes entornos virtuales, entonces venves todo lo que necesita.

Si desea utilizar varias versiones de Python en 3.3+ , con o sin entornos virtuales , continúe leyendo sobre pyenv.

Si también desea trabajar con Python 2 , entonces pyenv-virtualenves una herramienta a considerar.

venv

Desde Python 3.3+ venvse incluye el paquete. Es ideal para crear entornos virtuales ligeros.

Hasta Python 3.6 pyvenvtambién se incluía un script llamado como envoltorio venv, pero ha quedado obsoleto. Se eliminará por completo en Python 3.8. Exactamente la misma funcionalidad está disponible cuando se usa venv, y cualquier documentación existente debe actualizarse. Para cualquier persona interesada, puede leer las razones detrás de la depreciación pyvenv.

venv se utiliza para crear un nuevo entorno a través del comando de terminal:

$ python3 -m venv directory-name-to-create

activado con:

$ source name-given/bin/activate

y desactivado con simplemente:

$ deactivate

Si necesita eliminar el entorno por completo después de desactivarlo, puede ejecutar:

$ rm -r name-given

De forma predeterminada, el entorno que crea será la versión actual de Python que está utilizando. Si está escribiendo documentación y desea la seguridad adicional de que su lector está utilizando la versión correcta de Python, puede especificar el número de versión mayor y menor en el comando, así:

$ python3.6 -m venv example-three-six

Si el lector está usando una versión diferente a la 3.6, entonces el comando no será exitoso y lo indicará en su mensaje de error. Sin embargo, cualquier versión de parche (por ejemplo 3.6.4) funcionará.

Cuando el entorno está activo, se pueden instalar todos los paquetes a través de la pipforma habitual. De forma predeterminada, el entorno recién creado no incluirá ningún paquete ya instalado en la máquina. Como pipsí mismo no se instalará necesariamente en la máquina. Se recomienda actualizar primero pipa la última versión, utilizando pip install --upgrade pip.

Los proyectos suelen tener un requirements.txtarchivo que especifica sus dependencias. Esto permite que el comando de pip install -r requirements.txtcomando de acceso directo instale rápidamente todos los paquetes en el entorno virtual recién creado. Solo existirán en el entorno virtual. No estará disponible cuando se desactive, pero persistirá cuando se reactive.

Si no necesita utilizar versiones adicionales de Python, entonces esto es todo lo que necesita para crear entornos virtuales aislados y específicos del proyecto.

pyenv

Si desea utilizar varias versiones de Python en una sola máquina, entonces pyenves una herramienta de uso común para instalar y cambiar entre versiones. Esto no debe confundirse con el pyvenvscript depreciado mencionado anteriormente . No viene incluido con Python y debe instalarse por separado.

La pyenvdocumentación incluye una gran descripción de cómo funciona, por lo que aquí veremos simplemente cómo usarlo.

Primero tendremos que instalarlo. Si usamos Mac OS X, podemos hacer esto usando Homebrew, de lo contrario, considere otras opciones de instalación.

$ brew update $ brew install pyenv

A continuación, agregue lo siguiente hacia la parte inferior de sus scripts de shell para permitirle pyenvcambiar automáticamente las versiones:

eval "$(pyenv init -)"

Para ello, abra su uso en shell script, a través de $ ~/.zshrc, $ ~/.bashrco $ ~/.bash_profiley copiar y pegar la línea anterior en.

La ejecución pyenv versionsmostrará qué versiones de Python están instaladas actualmente, *junto a la que está actualmente en uso. pyenv versionmuestra esto directamente y python --versionse puede utilizar para verificarlo.

Para instalar una versión adicional, digamos 3.4.0, simplemente use pyenv install 3.4.0.

pyenv busca en cuatro lugares para decidir qué versión de Python usar, en orden de prioridad:

  1. La PYENV_VERSIONvariable de entorno (si se especifica). Puede usar el pyenv shellcomando para establecer esta variable de entorno en su sesión de shell actual.
  2. El .python-versionarchivo específico de la aplicación en el directorio actual (si está presente). Puede modificar el .python-versionarchivo del directorio actual con el pyenv localcomando.
  3. El primer .python-versionarchivo encontrado (si lo hay) buscando en cada directorio principal, hasta llegar a la raíz de su sistema de archivos.
  4. El archivo de versión global. Puede modificar este archivo usando el pyenv globalcomando. Si el archivo de versión global no está presente, pyenv asume que desea utilizar el "sistema" de Python. (En otras palabras, cualquier versión se ejecutaría si pyenv no estuviera en su PATH.)

Al configurar un nuevo proyecto que utilizará Python 3.6.4 pyenv local 3.6.4, se ejecutará en su directorio raíz. Esto establecería la versión y crearía un .python-versionarchivo, para que las máquinas de otros colaboradores lo recogieran.

La descripción completa de los pyenvcomandos es una para marcar.

pyenv y venv

Al trabajar con Python 3.3+, ahora sabemos cómo instalar y cambiar entre diferentes versiones de Python, y cómo crear nuevos entornos virtuales.

Como ejemplo, digamos que estábamos configurando un proyecto que iba a usar Python 3.4.

Primero podríamos configurar nuestra versión local usando pyenv local 3.4.0.

Si luego ejecutamos python3 -m venv example-projectun nuevo entorno virtual, se configuraría example-projectcon nuestro Python 3.4.0 habilitado localmente.

Activamos usando source example-project/bin/activatey podemos empezar a trabajar.

A continuación, podríamos, opcionalmente, documentar que un colaborador debería utilizar python3.4 -m venv . Esto significa que incluso si un colaborador no estuviera usando pyenv, el python3.4comando produciría un error si su versión de Python no fuera la misma versión mayor y menor (3 y 4), como pretendíamos.

Alternativamente, podríamos optar por especificar simplemente que se usaría 3.4.0 e instruir python3 -m venv . Si creemos que cualquier versión mayor que 3.4 es aceptable, entonces también podemos optar por usar python3over python3.4, como si el colaborador estuviera usando 3.6, de lo contrario, también recibiría un error. Esta es una decisión específica del proyecto.

pyenv-virtualenv

pyenvse puede utilizar para instalar Python 2 y 3 versiones. Sin embargo, como hemos visto, venvestá limitado a versiones de Python superiores a 3.3.

pyenv-virtualenves una herramienta para crear entornos virtuales integrados pyenvy funciona para todas las versiones de Python. Todavía se recomienda utilizar Python oficial venvsiempre que sea posible. Pero si, por ejemplo, está creando un entorno virtual basado en 2.7.13, entonces esto es un complemento pyenv.

También funciona bien con condaentornos Anaconda y Miniconda si ya los está utilizando. virtualenvTambién existe una herramienta llamada . No está cubierto aquí, pero está vinculado al final.

Después de instalarlo, pyenvse puede instalar usando Homebrew (o alternativas) de la siguiente manera:

$ brew install pyenv-virtualenv

A continuación, en su .zshrc, .bashrco .bash_profile(según el shell que utilice) agregue lo siguiente hacia la parte inferior:

eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)"

Esto permite pyenvactivar y desactivar entornos automáticamente al mover directorios.

Para crear un nuevo entorno virtual, use:

$ pyenv virtualenv   // for example $ pyenv virtualenv 2.7.10 my-virtual-env-2.7.10

Los entornos existentes se pueden enumerar con:

$ pyenv virtualenvs

Activado / desactivado con:

$ pyenv activate  $ pyenv deactivate

En el momento de escribir este artículo, cuando se utilice , se mostrará activatela advertencia prompt changing will be removed from future release. Esto es lo esperado y se refiere solo a la (env-name)visualización en su shell, no al uso del activatecomando en sí.

Los requisitos de instalación funcionan como se describe en venv. A diferencia de venvun rm -rcomando, no es necesario eliminar un entorno, uninstallexiste un comando.

Pensamientos finales

Entre estas tres herramientas, tenemos la capacidad de colaborar en cualquier proyecto, sin importar la versión de Python o de las dependencias requeridas. También sabemos cómo documentar las instrucciones de configuración para que otros las utilicen en cualquier proyecto en el que trabajemos.

También podemos ver el razonamiento detrás de qué conjunto usar, ya que no todos los desarrolladores requerirán los tres.

Con suerte, esto fue útil y es una referencia útil en combinación con la documentación vinculada a continuación.

¡Gracias por leer! ?

Otras cosas que he explorado:

  • Simulacros de módulos ES y CommonJS con jest.mock ()
  • Una guía para principiantes del Elastic Container Service de Amazon

Recursos

  • Entornos virtuales de Python: una introducción
  • Depreciando pyvenv
  • venvDocumentación de Python
  • venv vs virtualenv
  • ¿Cuál es la diferencia entre venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenv, etc?
  • ¿Necesito instalar pip?