xonsh - python como uma substituição de shell

Surpreendentemente, no hub ainda não existe um post sobre uma substituição de shell tão interessante como o xonsh ( github ), do meu ponto de vista, a sintaxe de todos os shells é terrível e não vejo razão para salvá-lo no século XXI, e no Python, no meu possui excelente sintaxe e muitas outras vantagens, portanto, na minha opinião, deve ser a linguagem de automação padrão, que é o que o xonsh está tentando obter .


Estou usando o xonsh há algum tempo, então acho que posso falar sobre isso o suficiente para começar a usá-lo.


Reservas:


  • O xonsh é apenas sobre Python 3, mas essa é a norma .
  • O xonsh ainda não foi lançado (versão 0.8.3 no momento da redação). Aparentemente, de acordo com os desenvolvedores, nem todos os recursos desejados foram implementados ainda, mas de acordo com meus sentimentos, tudo funciona (se você observar as diferenças, sobre as quais abaixo).

A principal característica do xonsh é que ele adivinha "magicamente" o que você digitou - um comando python ou shell, e isso funciona muito bem.


Você pode inserir código python nos comandos do shell usando um cachorro .


Não vou me deter sobre quais são os recursos do xonsh, isso é descrito de forma clara e clara na documentação e em qualquer artigo . Do meu ponto de vista, basta que você possa obter a sintaxe normal do loop no shell:


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

Portanto, tentarei focar no que não está descrito ou está mal descrito.


Instalação


Descreverei a instalação (para Debian / Ubuntu) que não requer privilégios de superusuário, embora apenas tenha mudado recentemente para esse esquema, coloquei-o nas pastas do sistema antes, escrevi em /etc/shells e mudei o shell com o comando chsh , mas à primeira vista tudo funciona também com o novo método, e me parece mais correto, não quero entupir o sistema com pacotes não dos repositórios, mas aqui todos decidem por si mesmos.


Colocamos pip se ainda não:


 sudo apt-get install python3-pip 

Colocamos xonsh (sem sudo), eu dou um comando que instala todas as dependências opcionais para obter todos os pães concebidos pelos autores; se alguém quiser uma instalação mínima, você pode remover os colchetes com o conteúdo:


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

Provavelmente você já possui em algum lugar no .profile no PATH os caminhos para a pasta local com os binários $HOME/.local/bin , mas eles são adicionados apenas se existirem, portanto, é necessário reiniciar o terminal para que esse código funcione e o binário xonsh teve que correr e ver.
A atualização é padrão:


 pip3 install --user xonsh --upgrade 

venv


Colocamos venv se queremos usar a funcionalidade correspondente (veja mais em vox):


 sudo apt-get install python3-venv 

Todos os venvs são afiados para shells específicos; portanto, o xonsh oferece seu próprio invólucro chamado vox , mas, para uso confortável, vale a pena instalar a extensão avox :


 pip3 install --user xontrib-avox 

Instalação do Pyenv


Se houver necessidade de ambientes virtuais com uma versão arbitrária do python, será necessário clonar o pyenv instalando primeiro as dependências para a construção do python :


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

Além disso, no exemplo de configuração, você pode ver a instalação de um par de variáveis ​​de ambiente para usar o pyenv.


Lançamento


Agora temos tudo instalado e resta fazer do xonsh um shell, para não alterar nada fora da pasta do usuário, eu uso o seguinte código (baseado no SO ) para o bash (se você tiver outro shell, você sabe o que fazer, mas não usa .profile desde que o xonsh lê também) adicionado ao .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 o shell e, se tudo correu bem, você já está no xonsh, ou seja, essencialmente no console python, e você pode, por exemplo, executar cálculos diretamente na linha de comando, por exemplo, descobrir quanto 2+2 será.


Personalização


Antes de começar a usá-lo, você deve criar um arquivo de configuração .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 o shell para aplicar as novas configurações.


Vale a pena prestar atenção ao modelo de dados humanos - apelidos são um dicionário, maneiras são uma lista, parece óbvio, mas por alguma razão nem sempre é assim.
Além disso, importamos o módulo os na configuração, o que significa que ele já estará disponível em nosso shell, para que você possa importar os módulos necessários e obter seu próprio ambiente confortável.


O início do arquivo acima é mais para demonstrar os recursos, mas as três últimas linhas permitem usar convenientemente ambientes virtuais, um exemplo do qual é usado posteriormente.


Usando ambientes virtuais


Crie uma pasta de projeto (a avox espera que todos os projetos estejam em $PROJECT_DIRS ):


 mkdir -p projects/test 

Crie um ambiente virtual para este projeto:


 vox new test 

Graças ao avox configurado avox precisamos apenas ir para a pasta do projeto para ativar o ambiente virtual, não precisamos executar nenhuma source ./bin/activate estranha 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' 

Ao sair da pasta, o ambiente virtual é desativado:


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

Ao mesmo tempo, você pode ver mais trabalho humano com o redirecionamento de fluxos de E / S , que nunca se esquece de como fazer isso em todos os tipos de festivais, seja o primeiro a enviar comentários para mim.


Por uma questão de completude, eu gostaria que nesses ambientes virtuais fosse possível usar uma versão arbitrária do python, por exemplo, instalada através do pyenv, mas até agora ele não cresceu juntos e as mãos não chegaram a se fortalecer.
UPD: Há pouco tempo, o xonsh foi ensinado a usar uma versão arbitrária do python em ambientes virtuais.
Instale a versão desejada do python (lista de pyenv install --list disponíveis):


 pyenv install 3.7.2 

Crie um ambiente virtual com ela:


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

Verificamos:


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

Ancinho


A única coisa que inventei são as diferenças de escape :


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

não funcionará, porque o escape da barra invertida não funciona no xonsh e os chavetas têm um significado especial, é necessário usar aspas, por exemplo:


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

Algumas diferenças do bash estão na forma de uma tabela na documentação .


Conclusão


Parece-me que o xonsh é um bom concorrente para o shell normal do futuro para todos, e principalmente deve atrair os pythonists. Comece a usar (a instalação sem o sudo facilita a reversão, você pode simplesmente excluir a pasta) para entender se tudo está disponível para você pessoalmente, talvez seja isso que você estava procurando, mas estava com medo de instalar.


Adições nos comentários


  1. Definindo variáveis ​​de ambiente para pastas .
  2. Ganchos de ativação do ambiente virtual

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


All Articles