<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Cristian Javier Azulay</title>
    <description>The latest articles on DEV Community by Cristian Javier Azulay (@cjadeveloper).</description>
    <link>https://dev.to/cjadeveloper</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F237794%2Fcd1fd0c2-685a-45ee-83e2-0e139cd69d03.jpeg</url>
      <title>DEV Community: Cristian Javier Azulay</title>
      <link>https://dev.to/cjadeveloper</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cjadeveloper"/>
    <language>en</language>
    <item>
      <title>Entornos Virtuales Python en fish usando Oh-My-Fish y Pyenv</title>
      <dc:creator>Cristian Javier Azulay</dc:creator>
      <pubDate>Tue, 18 Aug 2020 10:12:52 +0000</pubDate>
      <link>https://dev.to/cjadeveloper/entornos-virtuales-python-en-fish-usando-oh-my-fish-y-pyenv-2dcc</link>
      <guid>https://dev.to/cjadeveloper/entornos-virtuales-python-en-fish-usando-oh-my-fish-y-pyenv-2dcc</guid>
      <description>&lt;p&gt;Una manera directa de crear entornos virtuales Python 3.8 usando el shell fish&lt;/p&gt;

&lt;h2&gt;
  
  
  Pyenv y el Modulo venv de Python
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pyenv
&lt;/h3&gt;

&lt;p&gt;Primero, usamos &lt;a href="https://github.com/pyenv/pyenv#simple-python-version-management-pyenv"&gt;Pyenv&lt;/a&gt; para instalar o seleccionar una implementacion de Python distinta a la del sistema. Podemos verificar primero si tenemos la versión de Python que necesitamos mediante&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pyenv versions
&lt;span class="go"&gt;* system (set by /home/cjadeveloper/.pyenv/version)
  3.6.8
  3.7.4
  3.8.2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;De no tenerlo instalado, haríamos un &lt;code&gt;pyenv install 3.8.2&lt;/code&gt; pero como ya lo tengo instalado, lo selecciono para el proyecto haciendo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;pyenv local 3.8.2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto nos va a crear un archivo &lt;code&gt;.python-version&lt;/code&gt; en el directorio que nos permitirá 2 cosas, guardar una referencia de la versión de Python con la que trabajaremos en el proyecto y cambiar la versión global de Python por la que hemos elegido.&lt;/p&gt;

&lt;p&gt;NOTAS:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Este mecanismo se puede anular configurando la variable de entorno &lt;code&gt;PYENV_VERSION&lt;/code&gt; o con el comando &lt;a href="https://github.com/pyenv/pyenv/blob/master/COMMANDS.md#pyenv-shell"&gt;pyenv shell&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tanto el comando &lt;code&gt;pyenv local [version]&lt;/code&gt; como &lt;code&gt;pyenv global [version]&lt;/code&gt; nos permiten definir mas de una version a usar al mismo tiempo en un proyecto. Esto es muy útil para usar con herramientas como &lt;a href="https://tox.readthedocs.io/en/latest/"&gt;tox&lt;/a&gt; por ejemplo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Si al configurar un intérprete local (o global) no funciona en fish &lt;em&gt;(Es decir que siempre nos inicia el interprete de Python por defecto instalado)&lt;/em&gt;. Vamos a tener que editar el archivo de configuración de fish &lt;code&gt;~/.config/fish/config.fish&lt;/code&gt; y agregar las siguientes líneas:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;setenv&lt;/span&gt; &lt;span class="n"&gt;PYENV_ROOT&lt;/span&gt; &lt;span class="s"&gt;"$HOME/.pyenv"&lt;/span&gt;
&lt;span class="n"&gt;setenv&lt;/span&gt; &lt;span class="n"&gt;PATH&lt;/span&gt; &lt;span class="s"&gt;"$PYENV_ROOT/shims:$PYENV_ROOT/bin:$PATH"&lt;/span&gt;
&lt;span class="n"&gt;pyenv&lt;/span&gt; &lt;span class="n"&gt;rehash&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Creando un entorno virtual dentro del proyecto con el modulo venv directamente
&lt;/h2&gt;

&lt;p&gt;La forma que a mi más me gusta trabajar con los entornos virtuales de Python es la que se conoce como &lt;em&gt;"own site directory"&lt;/em&gt; de la misma manera que se suele trabajar con los modulos en Node: &lt;em&gt;"Creando una carpeta dentro del proyecto que estamos trabajando en la que contenga nuestra versión de los paquetes que queremos aislar de los del sistema y el propio binario de Python (que va a coincidir con el usado para crear el venv)."&lt;/em&gt; Para hacer todo ello de un solo paso, podemos usar el modulo &lt;code&gt;venv&lt;/code&gt; que esta disponible desde la versión 3.3 de Python, de la siguiente manera&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;python -m venv .venv
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto nos creará un entorno virtual de nombre &lt;code&gt;.venv&lt;/code&gt; en el directorio actual y bajo la carpeta &lt;code&gt;/.venv&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Activando nuestro entorno virtual bajo fish
&lt;/h2&gt;

&lt;p&gt;Si estamos usando &lt;a href="https://fishshell.com/"&gt;fish&lt;/a&gt; con &lt;a href="https://github.com/oh-my-fish/oh-my-fish/blob/master/docs/es-ES/README.md"&gt;Oh-My-Fish&lt;/a&gt; como infraestructura y tenemos instalados unos de sus temas, activar un entorno virtual python de la manera tradicional puede &lt;a href="https://github.com/fish-shell/fish-shell/issues/1118"&gt;romper&lt;/a&gt; el bonito prompt que hayamos configurado con Oh-My-Fish. Para que esto no suceda tenemos que setear la variable de entorno &lt;code&gt;VIRTUAL_ENV_DISABLE_PROMPT&lt;/code&gt; en &lt;code&gt;1&lt;/code&gt; en nuestro archivo de configuración de fish que, generalmente se encuentra en &lt;code&gt;~/.config/fish/&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ~/.config/fish/config.fish&lt;/span&gt;

&lt;span class="c"&gt;# ... another config&lt;/span&gt;

&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt; VIRTUAL_ENV_DISABLE_PROMPT 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego, hay que recargar el shell, para que vuelva a leer los archivos de config, mediante &lt;code&gt;exec fish&lt;/code&gt;. Con esto no se nos va a romper el shell al usar algún tema de &lt;a href="https://github.com/oh-my-fish/oh-my-fish/blob/master/docs/es-ES/README.md"&gt;Oh-My-Fish&lt;/a&gt;. Ésto lo haremos solo la primera vez. Luego podemos activar el entorno virtual sin tener que configurar nuevamente la variable &lt;code&gt;VIRTUAL_ENV_DISABLE_PROMPT&lt;/code&gt;, claro ésta.&lt;/p&gt;

&lt;p&gt;Para desactivar el entorno, simplemente escribimos &lt;code&gt;deactivate&lt;/code&gt; en la consola.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entendiendo un poco más que hace el módulo venv
&lt;/h2&gt;

&lt;p&gt;Otra forma de gestionar el entorno virtual sin usar el script que sobreescribe nuestro prompt es hacer nuestro propio &lt;em&gt;activador de entorno virtual&lt;/em&gt; cambiando el valor de la variable de entorno PATH que es el que le dice a nuestro shell que instancia de Python usar cuando llamemos al interprete. Para entender a que nos referimos vamos a listar la variable $PATH y ver su contenido antes de la activación&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;span class="go"&gt;/home/cjadeveloper/.pyenv/shims /home/cjadeveloper/.pyenv/bin /home/cjadeveloper/.local/bin /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cuando invoca a un intérprete de Python o ejecuta un script &lt;code&gt;.py&lt;/code&gt;, su shell busca en los directorios listados en el diccionario PATH en orden, hasta que encuentra una instancia de Python. Para ver qué instancia de Python encuentra primero PATH, ejecute el comando que viene con pyenv: &lt;code&gt;pyenv which python&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pyenv which python
&lt;span class="go"&gt;/home/cjadeveloper/.pyenv/versions/3.8.2/bin/python
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Entonces lo que tenemos que hacer es indicarle al principio del path la ruta del interprete de python que queremos usar. Lo podemos hacer sobreescribiendo la variable de entorno &lt;code&gt;PATH&lt;/code&gt; para la sesión actual del shell así&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;set -lx PATH (realpath .venv/bin) $&lt;/span&gt;PATH
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lo anterior significa que definimos una variable PATH local y exportada que va a incluir delante del path actual la ruta completa a la carpeta &lt;code&gt;.venv/bin&lt;/code&gt; que estoy especificando. Esta variable PATH al ser local y exportada va a permanecer activa en la sesion actual solamente y prevalecera sobre la variable PATH heredada del shell. Esto tiene su pro y su contra, como veremos mas adelante.&lt;/p&gt;

&lt;p&gt;Pero sigamos con el path, por un momento. Al volver a consultar la variable PATH vamos a obtener lo siguiente&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;span class="go"&gt;/home/cjadeveloper/code/examples/python/venvexs/venv1/.venv/bin /home/cjadeveloper/.pyenv/shims /home/cjadeveloper/.pyenv/bin /home/cjadeveloper/.local/bin /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con el path del entorno virtual creado anteriormente inyectado al principio. Por ende, si verificamos python nuevamente, vamos a tener&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;which python
&lt;span class="go"&gt;/home/cjadeveloper/code/examples/python/venvexs/venv1/.venv/bin/python
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora podemos simular lo que hace virtualenv con su script de activación y establecer el prompt de shell un poco mas bonito e informativo seteando la variable de entorno &lt;code&gt;VIRTUAL_ENV&lt;/code&gt; que es usada por fish para indicar que estamos dentro de un entorno virtual&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;set VIRTUAL_ENV "$&lt;/span&gt;PWD/.venv&lt;span class="s2"&gt;"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ya estamos listos para usar python en nuestro entorno virtual. Primero que todo veamos si estamos utilizando la versión de pip correcta para instalar nuestros paquetes. Podemos hacerlo de 2 formas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;pip show pip
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;o también (y es la que algunos prefieren para estar 100% de trabajar con el intérprete que desean)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;python -m pip show pip
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hooray! Ahora podemos hacer nuestro día en Python y cuando terminamos, solamente hay que setear el PATH nuevamente&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;set -lx PATH $&lt;/span&gt;PATH[2..-1]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y salir del entorno, reiniciando el shell.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;exec fish
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://datagrok.org/python/activate/#top"&gt;Prefer Subshells for Context&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://towardsdatascience.com/virtual-environments-104c62d48c54"&gt;A Guide to Python’s Virtual Environments&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://snarky.ca/a-quick-and-dirty-guide-on-how-to-install-packages-for-python/"&gt;A quick-and-dirty guide on how to install packages for Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pyenv/pyenv/issues/32#issuecomment-21018739"&gt;pyenv issue: Fish Shell support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>linux</category>
    </item>
  </channel>
</rss>
