xonsh - python comme remplacement de shell

Étonnamment, sur le hub, il n'y a toujours pas de post sur un remplacement de shell aussi intéressant que xonsh ( github ), de mon point de vue, la syntaxe de tous les shells est terrible et je ne vois aucune raison de l'enregistrer au 21e siècle, et Python, dans mon il a une excellente syntaxe et de nombreux autres avantages, donc, à mon avis, ce devrait être le langage d'automatisation par défaut, ce que xonsh essaie d'atteindre .


J'utilise xonsh depuis un certain temps, donc je pense que je peux en parler suffisamment pour commencer à l'utiliser.


Réservations:


  • xonsh ne concerne que Python 3, mais c'est la norme .
  • xonsh n'a pas encore été publié (version 0.8.3 au moment de la rédaction), apparemment, selon les développeurs, toutes les fonctionnalités souhaitées n'ont pas encore été implémentées, mais selon mes sentiments, tout fonctionne (si vous regardez les différences, dont ci-dessous).

La principale caractéristique de xonsh est qu'il devine "par magie" ce que vous avez entré - une commande python ou shell, et cela fonctionne très bien.


Vous pouvez insérer du code python dans des commandes shell à l'aide d'un chien .


Je ne m'attarderai pas sur les fonctionnalités de xonsh, cela est clairement et graphiquement décrit dans la documentation et toutes sortes d' articles , de mon point de vue, il suffit que vous puissiez obtenir la syntaxe de boucle normale dans le shell:


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

Par conséquent, je vais essayer de me concentrer sur ce qui n'est pas décrit ou mal décrit.


L'installation


Je décrirai l'installation (pour Debian / Ubuntu) qui ne nécessite pas de privilèges de superutilisateur, bien que je ne sois passé que récemment à un tel schéma, je l'ai mis dans les dossiers système avant, je l'ai écrit dans /etc/shells et chsh changé le shell avec la commande chsh , mais à première vue tout fonctionne également avec la nouvelle méthode, et il me semble plus correct, je ne veux pas obstruer le système avec des paquets qui ne proviennent pas des référentiels, mais ici, chacun décide pour lui-même.


On met pip si pas déjà:


 sudo apt-get install python3-pip 

Nous mettons xonsh (sans sudo), je donne une commande qui installe toutes les dépendances optionnelles pour obtenir tous les chignons conçus par les auteurs, si quelqu'un veut une installation minimale, alors vous pouvez supprimer les crochets avec le contenu:


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

Très probablement, vous avez déjà quelque part dans le .profile dans PATH les chemins vers le dossier local avec les binaires $HOME/.local/bin sont ajoutés, mais ils ne sont ajoutés que s'ils existent, vous devez donc redémarrer le terminal pour que ce code fonctionne et le binaire xonsh a dû courir et voir.
La mise à jour est standard:


 pip3 install --user xonsh --upgrade 

venv


Nous mettons venv si nous voulons utiliser la fonctionnalité correspondante (voir plus loin sur vox):


 sudo apt-get install python3-venv 

Tous les venvs sont affûtés pour des coques spécifiques, donc xonsh propose son propre wrapper appelé vox , mais pour une utilisation confortable, il vaut la peine d'installer l'extension avox :


 pip3 install --user xontrib-avox 

Installation de Pyenv


S'il y a un besoin d'environnements virtuels avec une version arbitraire de python, alors vous devez cloner pyenv en installant d' abord les dépendances pour construire le python :


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

Plus loin dans l'exemple de configuration, vous pouvez voir l'installation d'une paire de variables d'environnement pour utiliser pyenv.


Lancement


Maintenant, nous avons tout installé et il reste à faire de xonsh un shell, afin de ne rien changer en dehors du dossier utilisateur, j'utilise le code suivant (basé sur SO ) pour le bash (si vous avez un autre shell, alors vous savez quoi faire, mais n'utilisez pas .profile puisque xonsh le lit aussi) ajouté à .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 

Nous redémarrons le shell et, si tout s'est bien passé, vous êtes déjà dans xonsh i.e. essentiellement dans la console python et vous pouvez, par exemple, effectuer des calculs directement sur la ligne de commande, par exemple, savoir combien sera 2+2 .


Personnalisation


Avant de commencer à l'utiliser, vous devez créer un fichier de configuration .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 

Redémarre le shell pour appliquer les nouveaux paramètres.


Il convient de prêter attention au modèle de données humaines - les alias sont un dictionnaire, les moyens sont une liste, cela semble évident, mais pour une raison quelconque, il n'en est pas toujours ainsi.
De plus, nous avons importé le module os dans la configuration, ce qui signifie qu'il sera déjà disponible dans notre shell, afin que vous puissiez importer les modules nécessaires et obtenir votre propre environnement confortable.


Le début du fichier ci-dessus est plus pour démontrer les capacités, mais les trois dernières lignes vous permettent d'utiliser facilement les environnements virtuels, dont un exemple est utilisé plus tard.


Utilisation d'environnements virtuels


Créez un dossier de projet (avox s'attend à ce que tous les projets soient dans $PROJECT_DIRS ):


 mkdir -p projects/test 

Créez un environnement virtuel pour ce projet:


 vox new test 

Grâce au avox configuré avox nous suffit d’aller dans le dossier du projet pour activer l’environnement virtuel, source ./bin/activate n’avons pas besoin d’effectuer une source ./bin/activate étrange 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' 

À la sortie du dossier, l'environnement virtuel est désactivé:


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

En même temps, vous pouvez voir plus de travail humain avec la redirection des flux d'E / S , qui n'a jamais oublié comment faire cela dans toutes sortes de bashs, laissez-les être les premiers à me lancer des commentaires.


Par souci d'exhaustivité, je voudrais que dans ces environnements virtuels, il soit possible d'utiliser une version arbitraire de python, par exemple, installée via pyenv, mais jusqu'à présent, elle n'a pas grandi ensemble et les mains ne sont pas parvenues à se durcir.
UPD: Il n'y a pas si longtemps, xonsh a appris à utiliser une version arbitraire de python dans des environnements virtuels.
Installez la version souhaitée de python (liste des pyenv install --list disponibles de pyenv install --list ):


 pyenv install 3.7.2 

Créez un environnement virtuel avec elle:


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

Nous vérifions:


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

Râteau


La seule chose que j'ai trouvée, ce sont les différences d'évasion :


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

ne fonctionnera pas, car l'échappement antislash ne fonctionne pas dans xonsh et les accolades ont une signification particulière, vous devez utiliser des guillemets, par exemple comme ceci:


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

Certaines différences avec bash se présentent sous la forme d'un tableau dans la documentation .


Conclusion


Il me semble que xonsh est un bon concurrent pour le shell normal du futur pour tous, et surtout il devrait plaire aux pythonistes. Commencez à utiliser (l'installation sans sudo facilite la restauration, vous pouvez simplement supprimer le dossier) pour comprendre si tout est là pour vous personnellement, c'est peut-être ce que vous cherchiez, mais avez peur d'installer.


Ajouts dans les commentaires


  1. Définition des variables d'environnement pour les dossiers .
  2. Crochets d'activation de l'environnement virtuel

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


All Articles