xonsh-python作为shell的替代品

令人惊讶的是,在中心上,仍然没有关于xonshgithub )这样非常有趣的shell替换的文章 ,从我的角度来看,所有shell的语法都很糟糕,我认为没有理由在21世纪和Python中保存它它具有出色的语法和许多其他优点,因此,我认为它应该是xonsh试图实现的默认自动化语言。


我已经使用xonsh已有一段时间了,所以我想可以开始谈论它了。


预订:


  • xonsh仅与Python 3有关,但这是规范
  • xonsh尚未发布(在撰写本文时为0.8.3版),显然,据开发人员说,尚未实现所有所需的功能,但根据我的感觉,一切正常(如果您查看下面的差异)。

xonsh的主要功能是它“神奇”地猜测您输入的内容-python或shell命令,并且效果很好。


您可以使用dog将python代码插入shell命令中。


我不会详细介绍xonsh的功能,在文档和任何文章中都对此进行了明确说明 ,从我的角度来看,您可以在shell中获得普通的循环语法就足够了:


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

因此,我将尝试着重于未描述或描述不充分的内容。


安装方式


我将描述不需要超级用户特权的安装(对于Debian / Ubuntu),尽管我只是最近才切换到这样的方案,但我将其放在系统文件夹中,写在/etc/shells并使用chsh命令更改了shell,但乍一看一切正常也使用新方法,对我来说似乎更正确,我不想用不是来自存储库的软件包来阻塞系统,但是每个人都可以自己决定。


如果尚未添加点子,我们将:


 sudo apt-get install python3-pip 

我们放了xonsh(不带sudo),我给出了一个安装所有可选依赖项的命令,以获取作者设想的所有包子,如果有人希望进行最小程度的安装,则可以删除包含以下内容的方括号:


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

很有可能您已经在PATH的.profile中的某个位置添加了带有二进制文件$HOME/.local/bin的本地文件夹的路径,但是只有在它们存在的情况下才添加它们,因此您需要重新启动终端,以便此代码起作用并且xonsh二进制文件必须跑去看看。
更新是标准的:


 pip3 install --user xonsh --upgrade 

静脉


如果要使用相应的功能,请放入venv(有关vox的更多信息,请参见):


 sudo apt-get install python3-venv 

所有venvs都针对特定的外壳进行了改进,因此xonsh提供了自己的包装器vox ,但是为了舒适使用,值得安装avox扩展:


 pip3 install --user xontrib-avox 

Pyenv安装


如果需要使用任意版本的python的虚拟环境,则需要通过首先安装用于构建python的依赖项来克隆pyenv:


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

进一步在示例配置中,您可以看到安装了一对环境变量以使用pyenv。


发射


现在我们已经安装了所有东西,剩下的就是使xonsh成为shell,为了不更改用户文件夹之外的任何东西,我对bash使用以下代码(基于SO )(如果您有另一个shell,那么您知道该怎么做,但是不使用.profile)因为xonsh也会读取它)添加到.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 

我们重新启动Shell,如果一切顺利,那么您已经在xonsh中,即 实际上,在python控制台中,例如,您可以直接在命令行上执行计算,例如,找出2+2


客制化


在开始使用它之前,您应该创建一个.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 

重新启动外壳以应用新设置。


值得关注的是人类数据模型- 别名是一个字典,方式是一个列表,这似乎很明显,但是由于某些原因,并不总是这样。
另外,我们在配置中导入了os模块,这意味着它已经可以在我们的Shell中使用,因此您可以导入必要的模块并获得自己舒适的环境。


上面文件的开头更多地展示了这些功能,但是最后三行使您可以方便地使用虚拟环境,稍后将使用其中的一个示例。


使用虚拟环境


创建一个项目文件夹(avox期望所有项目都在$PROJECT_DIRS ):


 mkdir -p projects/test 

为此项目创建一个虚拟环境:


 vox new test 

由于配置了avox附加组件avox我们只需要转到项目文件夹以激活虚拟环境, source ./bin/activate不需要执行任何奇怪的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' 

退出文件夹后,虚拟环境将被停用:


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

同时,您可以看到更多有关重定向I / O流的人工工作,他们从未忘记如何在各种bash中执行此操作,让他们成为第一个向我提出评论的人。


为了完整起见,我希望在这些虚拟环境中可以使用例如通过pyenv安装的任意版本的python,但是到目前为止, 它还没有一起发展 ,并且还没有动手来加固自己。
UPD:不久前,xonsh被教导在虚拟环境中使用任意版本的python。
安装所需版本的python(可用pyenv install --list列表):


 pyenv install 3.7.2 

与她一起创建虚拟环境:


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

我们检查:


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

耙子


我想到的唯一一件事就是转义区别


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

将不起作用,因为反斜杠转义在xonsh中不起作用,并且花括号具有特殊含义,因此需要使用引号,例如:


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

与bash的某些区别在于文档中的表格形式。


结论


在我看来,xonsh是未来所有人正常外壳的良好竞争者,尤其是它应该对python爱好者有吸引力。 开始使用(不使用sudo进行安装可以很容易地回滚,您可以简单地删除文件夹)来了解您是否个人所需的一切,也许正是您要找的东西,但是害怕安装。


评论中的补充


  1. 设置文件夹的环境变量
  2. 虚拟环境激活挂钩

Source: https://habr.com/ru/post/zh-CN429892/


All Articles