导读
Jupyter对于Python爱好者尤其是数据从业者来说,应该是日常使用最为频繁的工具之一了,虽然其严格来讲算不上是IDE,但却提供了非常便捷高效的数据探索和分析挖掘的coding环境。Jupyter固然好用,但如果不能充分挖掘其中的高端技巧,恐怕也不能完全发挥其功力。所以,今天本文就来分享个人在使用Jupyter过程中的3个实用技巧。
jupyter = Julia + Python + R 三种语言的混合缩略词(其中的字母e用于辅助发音),主要是提供了这3种语言的编程环境,其中由于Python语言近年来的日益火爆,jupyter对Python使用来说更为常见。
以Python语言为例,jupyter实际上是对Python解释器实现的Web UI服务包装,jupyter内部的一个个cell本质上与在Python命令行中键入一条条代码的效果是一致的,当然这里的Python解释器的ipython,一种增强型的python交互型解释器。既然jupyter本质上是一种web服务,那么自然区分在本地搭建服务或者基于服务器搭建服务,这也就是jupyter的本地模式和服务器模式。jupyter lab的配置和搭建可参考是时候总结一波Python环境搭建问题了。
另外,jupyter当前主要有两大版本,一个是jupyter notebook,另一个是其升级版,即jupyter lab。本文的3个实用技巧均面向jupyter lab而言,个人也一直觉得lab要比notebook更为好用。
01 多解释器环境设置
Python之所以如此功能强大和广受欢迎,其中一个重要原因就是其拥有强大的第三方库生态系统,甚至可以称得上是对大部分主流开源工具均有其Python实现版本,例如Echarts可视化有pyecharts,Spark工具有pyspark等等。然后,也正是由于库太多即由之而衍生的版本兼容问题,所以针对不同应用场景和需求建立不同的Python虚拟环境很重要。
jupyter对于虚拟环境十分友好的一点就是可以针对不同的虚拟环境关联提供相应的解释器环境,例如可以通过conda创建一个python爬虫env,而后安装常用的爬虫库,并在jupyter中提供一个爬虫解释器环境;类似的就可分别创建一个数据分析、机器学习或者是深度学习解释器环境,这样在jupyter中使用起来便会非常丝滑。
例如,如下是在jupyter lab内置全局解释器python3的基础上,增加一个dataScience解释器,而后在创建ipynb文件时即可选用对应的解释器即可。
这里给出在linux下增加jupyter解释器的主要命令:
pip install ipykernel # 需要安装ipykernel库用于管理解释器
# 虚拟环境名要求是已创建且存在的虚拟环境,一般使用conda管理
python -m ipykernel install --user --name 虚拟环境名 --display-name "web UI显示的解释器名称"
02 %和!:强大的魔法命令和shell支持
jupyter除提供对ipython解释器的web服务外,还扩展了强大的魔法命令。这里,魔法命令是指以%开头的line魔法或%%开头的cell魔法,大家最熟悉的可能当属即时命令:
%time # 对当前行的代码执行进行计时
%%time # 对当前整个cell的代码执行进行计时,要求改命令位于整个cell的首行
然而除此之外,jupyter实际上还提供了大量的魔法命令,可通过“%lsmagic”这条魔法命令本身打印输出所有魔法命令:
魔法命令打印结果分为面向line和面向cell的两类魔法命令,点开line魔法,我们可以看到以下几个熟悉的命令,例如lsmagic本身、run以及time和timeit等,另外下面的例如mkdir、ls、cd等就是常用的linux命令。
再翻开cell魔法,几个值得关注的命令包括:
其中对!魔法命令的解释为“OSMagics”,意味着这是一个与系统有关的命令,实际上可以用!+linux命令实现在jupyter中执行相应linux命令的效果。
注:通过lsmagic打印出魔法命令中,结果是一个嵌套的json格式,其中最里层的key即为魔法命令(上述绿字部分),后面的value是对其类型的解释(上述粉字部分)。
那么问题来了,说了这些魔法命令,他们有什么好用之处吗?这里简单举3个小例子:
使用!pip命令执行第三方库安装。当部署jupyter所在环境具有pip功能时,可直接在jupyter中通过!pip便捷的对当前解释器环境的第三方库依赖进行管理,非常方便;
使用!python或%run命令实现对本地python脚本文件的运行,其中!python中要求已在当前linux环境中配置python全局命令,相应的也可能是python2或python3等;
灵活使用!ls功能,将当前文件夹内的所有文件赋予给指定列表接收,避免一个个文件名的复制粘贴过程。例如,假设当前文件夹中存在很多csv或其他格式的数据文件,用如下命令实现文件名的列表化还是比较方便的:
03 替代Xshell和Xftp功能
这个功能源于一个真实的场景:话说在某个临时集群环境中,由于种种原因不能使用Xshell和Xftp等类似工具直接操作集群内文件(使用linux服务器的应该都很熟悉这两个工具吧),但是开放了部分端口可供使用。在此种情况下,笔者自然联想到可通过部署jupyter lab服务来曲线达成目的。具体而言:
完成jupyter lab服务部署和启动后(在服务器端部署jupyter lab服务的具体流程可自行搜索),注意到在其web UI界面左侧的文件管理中提供了upload和download功能,这不刚好就是xftp的核心需求吗?
在jupyter lab的解释器选择界面,除了notebook和console之外,下面还提供了terminal功能,点进去就直接提供了服务器端的shell功能,巧了,这不就是一个xshell嘛!
以上,从某种角度讲,jupyter lab = ipython + 部分conda + Xshell + Xftp,何其强大也!
相关阅读: