xonsh - python como reemplazo de shell

Sorprendentemente, en el centro todavía no hay una publicación sobre un reemplazo de shell tan interesante como xonsh ( github ), desde mi punto de vista, la sintaxis de todos los shells es terrible y no veo ninguna razón para guardarlo en el siglo XXI, y Python, en mi tiene una sintaxis excelente y muchas otras ventajas, por lo tanto, en mi opinión, debería ser el lenguaje de automatización predeterminado, que es lo que xonsh está tratando de lograr .


He estado usando xonsh durante algún tiempo, así que creo que puedo hablar lo suficiente como para comenzar a usarlo.


Reservas:


  • xonsh solo se trata de Python 3, pero esa es la norma .
  • xonsh aún no se ha lanzado (versión 0.8.3 en el momento de la redacción), al parecer, según los desarrolladores, todavía no se han implementado todas las características deseadas, pero según mis sentimientos, todo funciona (si observa las diferencias, sobre las cuales se detalla a continuación).

La característica principal de xonsh es que adivina "mágicamente" lo que ingresó: un comando python o shell, y esto funciona bastante bien.


Puede insertar código python en comandos de shell utilizando un perro .


No me detendré en las características de xonsh, esto se describe clara y claramente en la documentación y en cualquier artículo , desde mi punto de vista, es suficiente que pueda obtener la sintaxis de bucle normal en el shell:


worldmind@x ~ $ for i in range(3): ............... echo $SHELL 

Por lo tanto, trataré de concentrarme en lo que no se describe o describe mal.


Instalación


Describiré la instalación (para Debian / Ubuntu) que no requiere privilegios de superusuario, aunque recientemente cambié a tal esquema, lo puse en las carpetas del sistema antes, lo escribí en /etc/shells y cambié el shell con el comando chsh , pero a primera vista todo funciona también con el nuevo método, y me parece más correcto, no quiero obstruir el sistema con paquetes que no provienen de los repositorios, pero aquí todos deciden por sí mismos.


Ponemos pip si no ya:


 sudo apt-get install python3-pip 

Ponemos xonsh (sin sudo), le doy un comando que instala todas las dependencias opcionales para obtener todos los bollos concebidos por los autores, si alguien quiere una instalación mínima, puede eliminar los corchetes con el contenido:


 pip3 install --user xonsh[ptk,pygments,proctitle,linux] 

Lo más probable es que ya tenga algún lugar en el .profile en PATH, se .profile las rutas a la carpeta local con los archivos binarios $HOME/.local/bin , pero se agregan solo si existen, por lo que debe reiniciar el terminal para que este código funcione y el binario xonsh tuvo que correr y ver.
La actualización es estándar:


 pip3 install --user xonsh --upgrade 

venv


Ponemos venv si queremos usar la funcionalidad correspondiente (ver más adelante en vox):


 sudo apt-get install python3-venv 

Todos los venvs están afilados para proyectiles específicos, por lo que xonsh ofrece su propio envoltorio llamado vox , pero para un uso cómodo vale la pena instalar la extensión avox :


 pip3 install --user xontrib-avox 

Instalación Pyenv


Si existe la necesidad de entornos virtuales con una versión arbitraria de python, entonces necesita clonar pyenv instalando primero las dependencias para construir el python :


 git clone https://github.com/pyenv/pyenv.git ~/.pyenv 

Además, en la configuración de ejemplo, puede ver la instalación de un par de variables de entorno para usar pyenv.


Lanzamiento


Ahora tenemos todo instalado y queda por hacer que xonsh sea un shell, para no cambiar nada fuera de la carpeta del usuario, uso el siguiente código (basado en SO ) para el bash (si tiene otro shell, entonces sabe qué hacer, pero no use .profile ya que xonsh también lo lee) agregado a .bashrc :


 # set default shell without editing /etc/shells if [ "${XONSH_VERSION:-unset}" = "unset" ] ; then export SHELL=$HOME/.local/bin/xonsh exec $HOME/.local/bin/xonsh -l fi 

Reiniciamos el shell y, si todo salió bien, ya estás en xonsh, es decir esencialmente en la consola de Python y puede, por ejemplo, realizar cálculos directamente en la línea de comando, por ejemplo, averiguar cuánto será 2+2 .


Personalización


Antes de comenzar a usarlo, debe crear un archivo de configuración .xonshrc :


 aliases['g'] = 'git' import os local_bin = '{}/.local/bin'.format($HOME) if os.path.isdir(local_bin): $PATH.append(local_bin) $PYENV_ROOT = '%s/.pyenv' % $HOME $PATH.insert(0, '%s/bin' % $PYENV_ROOT) xontrib load vox $PROJECT_DIRS = ["~/projects"] xontrib load avox 

Reinicia el shell para aplicar la nueva configuración.


Vale la pena prestar atención al modelo de datos humanos: los alias son un diccionario, las formas son una lista, parece obvio, pero por alguna razón no siempre es así.
Además, importamos el módulo os en la configuración, lo que significa que ya estará disponible en nuestro shell, para que pueda importar los módulos necesarios y obtener su propio entorno cómodo.


El comienzo del archivo anterior es más para demostrar las capacidades, pero las últimas tres líneas le permiten usar convenientemente entornos virtuales, un ejemplo del cual se usa más adelante.


Usando entornos virtuales


Cree una carpeta de proyecto (avox espera que todos los proyectos estén en $PROJECT_DIRS ):


 mkdir -p projects/test 

Cree un entorno virtual para este proyecto:


 vox new test 

Gracias al avox configurado avox solo tenemos que ir a la carpeta del proyecto para activar el entorno virtual, no necesitamos realizar ninguna source ./bin/activate extraña source ./bin/activate :


 worldmind@x ~ $ cd projects/test/ (test) worldmind@x ~/projects/test $ pip install see ... (test) worldmind@x ~/projects/test $ python -c 'import see' 

Al salir de la carpeta, el entorno virtual se desactiva:


 (test) worldmind@x ~/projects/test $ cd worldmind@x ~ $ python3 -c 'import see' err>out | fgrep 'NotFound' ModuleNotFoundError: No module named 'see' 

Al mismo tiempo, puede ver más trabajo humano con la redirección de flujos de E / S , que nunca olvidaron cómo hacer esto en todo tipo de bashs, que sean los primeros en enviarme comentarios.


En aras de la exhaustividad, me gustaría que en estos entornos virtuales sea posible utilizar una versión arbitraria de python, por ejemplo, instalada a través de pyenv, pero hasta ahora no ha crecido juntos , y las manos no han llegado para endurecerse.
UPD: No hace mucho tiempo, a xonsh se le enseñó a usar una versión arbitraria de python en entornos virtuales.
Instale la versión deseada de python (lista de pyenv install --list disponible pyenv install --list ):


 pyenv install 3.7.2 

Crea un entorno virtual con ella:


 mkdir projects/projectwith3.7 vox new -p $PYENV_ROOT/versions/3.7.2/bin/python projectwith3.7 

Comprobamos:


 (projectwith3.7) worldmind@x ~/projects/projectwith3.7 $ python --version Python 3.7.2 

Rastrillo


Lo único que se me ocurrió es la diferencia en escapar :


 find . -name data.txt -exec echo {} \; 

no funcionará, porque el escape de barra invertida no funciona en xonsh y las llaves tienen un significado especial, debe utilizar comillas, por ejemplo, así:


 find . -name .xonshrc -exec echo '{}' ';' 

Algunas diferencias de bash están en la forma de una tabla en la documentación .


Conclusión


Me parece que xonsh es un buen contendiente para el caparazón normal del futuro para todos, y especialmente debería atraer a los pitonistas. Comience a usar (la instalación sin sudo hace que sea fácil retroceder, simplemente puede eliminar la carpeta) para comprender si todo está allí para usted personalmente, tal vez esto es lo que estaba buscando, pero tenía miedo de instalarlo.


Adiciones en los comentarios


  1. Configuración de variables de entorno para carpetas .
  2. Ganchos de activación de entorno virtual

Source: https://habr.com/ru/post/es429892/


All Articles