令人惊讶的是,在中心上,仍然没有关于xonsh ( github )这样非常有趣的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进行安装可以很容易地回滚,您可以简单地删除文件夹)来了解您是否个人所需的一切,也许正是您要找的东西,但是害怕安装。
评论中的补充
- 设置文件夹的环境变量 。
- 虚拟环境激活挂钩