如何用iPad运行Python代码?

简介: 其实,不只是iPad,手机也可以。痛点我组织过几次线下编程工作坊,带着同学们用Python处理数据科学问题。其中最让人头疼的,就是运行环境的安装。
img_b4ea6f57478455e0b9c74bc472908124.jpe

其实,不只是iPad,手机也可以。

痛点

我组织过几次线下编程工作坊,带着同学们用Python处理数据科学问题。

其中最让人头疼的,就是运行环境的安装。

img_2215bc3026e8f0fda283026275046713.png

实事求是地讲,参加工作坊之前,我已经做了认真准备。

例如集成环境,选用了对用户很友好的Anaconda。

代码在我的Macbook电脑上跑,没有问题。还拿到学生的Windows 7上跑,也没有问题。这才上传到了Github。

在发布的教程文章里,我也已经把安装软件包的说明写得非常详细。

img_f6d20ce2ad137a8c9a94868f5d54c35e.png

还针对 Anaconda 这一 Python 运行环境的安装和运行,专门录制了视频

img_8bd0f6b64cc755d9f4909b73153f1303.png

但是,工作坊现场遇见的问题,依然五花八门。

有的是操作系统。例如你可能用Windows 10。实话实说,我确实没用过。拿着Surface端详,连安装后的Anaconda文件夹都找不到在哪儿。

有的是编码。不同操作系统,有的默认中文编码是UTF-8,有的是GBK。同样一段中文文本,我这里显示一切正常,你那里就是乱码。

有的是套件路径。来参加工作坊前,你可能看过我一些教程,并安装了 Python 2.7 版本 Anaconda。来到现场,一看需要 Python 3.6 版本,你就又安装了一份新的。结果执行起来,你根本分不清运行的 Python, pip 命令来自哪一个套件,更搞不清楚软件包究竟安装到哪里去了。再加上虚拟环境配置,你就要抓狂了。

还有的,甚至是网络拥塞问题。因为有时需要现场安装调用体积庞大的软件包,几十台电脑“预备——齐”一起争抢有限的Wifi带宽,后果可想而知。

痛定思痛,我决定改变一下现状。

目前的教程只提供基础源代码。对于许多新手同学来说,是不够的。

许多同学,就倒在了安装依赖软件包的路上,继而干脆放弃了。

变通的办法有许多。例如干脆录制代码执行视频给你看。

但是正如我在《MOOC教学,什么最重要?》一文中说过的,学习过程里,反馈最重要。

你需要能运行代码,并且第一时间获得结果反馈。

在此基础上,你还得能修改代码,对比前后执行结果的差别。

我得给你提供一个直接可以运行的环境。

零安装,自然也就没了上述烦恼。

这个事儿可能吗?

我研究了一下,没问题。

只要你的设备上有个现代化浏览器(包括但不限于Google Chrome, Firefox, Safari和Microsoft Edge等)就行。

IE 8.0?

那个不行,赶紧升级吧!

读到这里,你应该想明白了。因为只挑浏览器,不挑操作系统,所以别说你用Windows 10,你就是用iPad,都能运行代码。

尝试

请你打开浏览器,输入这个链接http://t.cn/R35fElv)。

看看会发生什么?

我这里用iPad给你演示。

一开始会有个启动界面出来。请你稍等10几秒钟。

img_afdf1fd79a4129e9b385bf5698206ebb.jpe

然后,你就能看到熟悉的Python代码运行界面了。

img_b4ea6f57478455e0b9c74bc472908124.jpe

这个界面来自 Jupyter Lab。

你可以将它理解为 Jupyter Notebook 的增强版,它具备以下特征:

  • 代码单元直接鼠标拖动;
  • 一个浏览器标签,可打开多个Notebook,而且分别使用不同的Kernel;
  • 提供实时渲染的Markdown编辑器;
  • 完整的文件浏览器;
  • CSV数据文件快速浏览
  • ……

图中左侧分栏,是工作目录下的全部文件。

右侧打开的,是咱们要使用的ipynb文件。

为了证明这不是逗你玩儿,请你点击右侧代码上方工具栏的运行按钮。

点击一下,就会运行出当前所在代码单元的结果。

不断点击下来,你可以看见,结果都被正常渲染。

img_e897ea60b86b9ebddef62c45ee3f11cf.jpe

连图像也能正常显示。

img_0d9007180af861189cc6992fc9e65653.jpe

甚至连下面这种需要一定运算量的可视化结果,都没问题。

img_e0b6ef82779cda52ebf251fc5440870d.jpe

为了证明这不是变魔术,你可以在新的单元格,写一行输出语句。

就让Python输出你的名字吧。

假如你叫 Chuck,就这样写:

print("Hello, Chuck!")

把它替换成你自己的姓名,看看输出结果是否正确?

img_41468c2c6ad249c8195856b19c8611ac.jpe

其实,又何止是iPad而已?

你如果足够勇(sang) 于(xin) 尝(bing) 试(kuang),手机其实也是可以的。

就像这样。

img_a18511035ba5a0654057615fe386dae4.jpe

流程

下面我给你讲讲,这种效果是怎么做出来的。

我们需要用到一款工具,叫做 mybinder 。它可以帮助我们,把 github 上的某个代码仓库(repo),快速转换成为一个可运行的环境。

注意 mybinder 为我们提供了云设施,也就是计算资源和存储资源。因此即便许许多多的用户同时在线使用同一份代码转换出来的环境,也不会互相冲突。

我们先来看看,怎么准备一个可供 mybinder 顺利转换的代码仓库。

我为你提供的样例在这里http://t.cn/R35MEqk):

img_5e3e2585f7de6871e1b51a03fda5e3d8.png

顺便说一句,这个样例来自于我的数据科学系列教程之《如何用Python处理自然语言?(Spacy与Word Embedding)》。感兴趣的同学可以点击链接,查看原文。

在该 GitHub 页面展示的文件列表中,你需要注意以下3个文件:

  • demo.ipynb
  • environment.yml
  • postBuild

其中demo.ipynb就是你在上一节看到的包含源代码的Jupyter Notebook文件。你需要首先在本地安装相关软件包,并且运行测试通过。

如果在你本地运行都有错误,放到云上去,想必也难以正常运行。

environment.yml文件非常重要,它来告诉 mybinder ,需要如何为你的代码运行准备环境。

我们打开看看该文件的内容:

dependencies:
  - python=3
  - pip:
    - spacy
    - ipykernel
    - scipy
    - numpy
    - scikit-learn
    - matplotlib
    - pandas
    - thinc

这个文件首先告诉 mybinder ,你的 Python 版本。我们采用的是 3.6 版。所以只需要指定 python=3 即可。mybinder 会自动为你下载安装最新的。

然后这个文件说明需要使用 pip 工具安装哪些软件包。我们需要把所有依赖的安装包都罗列出来。

这就是之前,我总在教程里给你说明的那些准备步骤。

但是这还没有完,因为 mybinder 只是为你安装好了一些软件依赖。

这里还有两个步骤需要处理:

  • 为了分析语义,我们需要调用预训练的Word2vec模型,这需要 mybinder 为我们提前下载好。
  • Jupyter Notebook 打开后,应当使用的 kernel 名称为 wangshuyi ,这个 kernel 目前还没有在 Jupyter 里面注册。我们需要 mybinder 代劳。

为了完成上述两个步骤,你就需要准备最后一个postBuild文件。

它的内容如下:

python -m spacy download en
python -m spacy download en_core_web_lg
python -m ipykernel install --user --name=wangshuyi

跟它的名字一样。它是在 mybinder 依据 environment.yml 安装了依赖组建后,依次执行的命令。如果你的代码需要其他的命令提供环境支持,也可以放在这里。

至此,你的准备工作就算结束了。

魔法表演正式开始。

请打开 mybinder 的网址https://mybinder.org/)。

img_0e2456ae923b630ecd4936a0b40de8fc.png

在 “GitHub repo or URL” 一栏,填写我们的 github 代码仓库链接,即:

https://github.com/wshuyi/demo-spacy-text-processing

我们希望一进入界面,就自动打开 demo.ipynb ,因此需要在“Path to a notebook file (optional)”一栏填写demo.ipynb

这时,你会发现“Copy the URL below and share your Binder with others:”一栏中,出现了你的代码运行环境网址。

https://mybinder.org/v2/gh/wshuyi/demo-spacy-text-processing/master?filepath=demo.ipynb

点击右侧的“复制”按钮保存到你的记事本里面。将来找到你转换好的运行环境,就全靠它了。

妥善保存地址后,点击“Launch”按钮。

img_c246b7c8bc02dc024b567857c78c905b.png

根据你的依赖安装包数量等因素,你需要等待的时间长短不一。但是只有第一次构建的时候,需要花一些时间。

以后每一次调用执行,就都会非常快了。

构建完毕后, mybinder 会自动为我们开启对应的运行环境。

img_948206a4eb09e5e237b97a7a23610454.png

很有成就感吧!

测试一下,能够正常运行代码,就证明我们成功了。

但是你会发现,不对啊!

老师你刚才用 iPad 展示的,不是高级版的 Jupyter Lab 吗?怎么又变成了 Jupyter Notebook 了?

我也想要高级版!

别着急。

看看你目前的链接地址:

https://mybinder.org/v2/gh/wshuyi/demo-spacy-text-processing/master?filepath=demo.ipynb

你只需要做个小小的调整,将其中的:

?filepath=

替换为:

?urlpath=lab/tree/

替换后的链接为:

https://mybinder.org/v2/gh/wshuyi/demo-spacy-text-processing/master?urlpath=lab/tree/demo.ipynb

把它输入到浏览器,看看出来的结果:

img_f395db956669e5f5bd2636938cf12002.png

这下没问题了吧?

原理

你是不是觉得,mybinder 很黑科技?

其实,也不算。

它只是把已有的几项技术,链接了起来。

这大概也算是“积木式创新”的一个实例吧。

我们看看 mybinder 的说明:

img_e1446b3856b7244ef885ee45d8e02c38.png

可以看到,其中最为关键的技术,是用了 docker 。

Docker 是个什么东西呢?

简单来说,Docker 就是为了不同平台上,都能够顺利执行同一份代码的保障工具。

你有些犹疑,这说的不是 Java 吗?

没错,Java 的宣传口号,就是一次编码,各处运行。

它利用虚拟机,来保障这种能力。

img_e9f3cb264c2d1842046bb321561bb646.png

但是,如果你经常使用 Java 开发出来的工具,就应该了解痛点有哪些了。

至少,你应该对 Java 程序的运行速度,有一些体会。

img_24249ff5451f34991a76da85fd9bc17a.png

上图中,左侧是虚拟机,右侧是Docker。

Docker 不但效率上要强过 Java 虚拟机,而且它支持的编程语言也不仅仅是一种。

至于其他好处,咱们就不展开了。否则听起来像广告。

其实,把 github 代码仓库转换为 docker 镜像(image)的工作,也不是 mybinder 自己来做的。

它调用的,是另外的一个工具,叫做 repo2dockerhttps://github.com/jupyter/repo2docker) 。

img_dbb6cff25decb0765d19e9f0dadff1b0.png

而你的浏览器能够执行 Python 代码,是因为 Jupyter Notebook (或者Lab)本来就是建立在“浏览器/服务器”(Browser / Server, B/S)结构上。

如果你已经在本地计算机安装过 Anaconda ,那不妨看看本地执行这个语句:

jupyter lab

会出现什么?

img_00d3011b3b2a0e9e2c0cf70572f8d196.png

对,它开启了一个服务器,然后打开你的浏览器,跟这个服务器通讯。

Jupyter 的这种设计,本身就让它的扩展极为方便。

无论 Jupyter 服务器是运行在你的本地笔记本上,还是摆在另一个大洲的机房,对你执行 Python 代码来说,都是没有本质区别的。

另外,如果你以为 mybinder 只能让你在浏览器上跑 Python 代码,那就太小瞧它了。

学过 R 的同学,请点击这个链接(http://t.cn/R3JLY2S),看看有什么惊喜。

小结

总结一下,本文为你讲述了以下内容:

  • 如何利用 mybinder ,把一个 github repo 一键转换成 Jupyter Lab 运行环境;
  • 如何在各种不同操作系统的浏览器上,运行该环境,编写、执行与修改代码;
  • mybinder 转换 github repo 的幕后英雄 docker 简介。

我希望你能想到的,不仅仅是这点儿简单的用途。

提几个问题给你,作为思考题:

  • 如果代码执行都在云端完成,教学实验室机房还有没有必要预装一大堆软件,且不定期更新维护?
  • 学校的编程练习、作业和考试有没有可能通过这种方式,直接远程进行,并且自动化评分?
  • 既然应用的技术都是开源的,你有没有可能利用这些开源工具搞个创业项目。例如提供深度学习环境,租赁给科研机构与创业公司?

期待你举一反三,做出有趣又有意义的创新来。

讨论

在 iPad 上运行 Python 代码的感觉怎么样?你用过类似的产品吗?你觉得有了这种技术,在日常工作和学习中,还可以有哪些有趣的应用场景?欢迎留言,把你的经验和思考分享给大家,我们一起交流讨论。

喜欢请点赞。还可以微信关注和置顶我的公众号“玉树芝兰”(nkwangshuyi)

如果你对数据科学感兴趣,不妨阅读我的系列教程索引贴《如何高效入门数据科学?》,里面还有更多的有趣问题及解法。

目录
相关文章
|
14天前
|
开发框架 数据建模 中间件
Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器是那些静悄悄的幕后英雄。它们不张扬,却能默默地为函数或类增添强大的功能。本文将带你了解装饰器的魅力所在,从基础概念到实际应用,我们一步步揭开装饰器的神秘面纱。准备好了吗?让我们开始这段简洁而富有启发性的旅程吧!
25 6
|
7天前
|
数据可视化 Python
以下是一些常用的图表类型及其Python代码示例,使用Matplotlib和Seaborn库。
通过这些思维导图和分析说明表,您可以更直观地理解和选择适合的数据可视化图表类型,帮助更有效地展示和分析数据。
45 8
|
14天前
|
API Python
【Azure Developer】分享一段Python代码调用Graph API创建用户的示例
分享一段Python代码调用Graph API创建用户的示例
38 11
|
16天前
|
测试技术 Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界中,装饰器是那些能够为我们的代码增添魔力的小精灵。它们不仅让代码看起来更加优雅,还能在不改变原有函数定义的情况下,增加额外的功能。本文将通过生动的例子和易于理解的语言,带你领略装饰器的奥秘,从基础概念到实际应用,一起开启Python装饰器的奇妙旅程。
31 11
|
12天前
|
Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器就像是给函数穿上了一件神奇的外套,让它们拥有了超能力。本文将通过浅显易懂的语言和生动的比喻,带你了解装饰器的基本概念、使用方法以及它们如何让你的代码变得更加简洁高效。让我们一起揭开装饰器的神秘面纱,看看它是如何在不改变函数核心逻辑的情况下,为函数增添新功能的吧!
|
13天前
|
程序员 测试技术 数据安全/隐私保护
深入理解Python装饰器:提升代码重用与可读性
本文旨在为中高级Python开发者提供一份关于装饰器的深度解析。通过探讨装饰器的基本原理、类型以及在实际项目中的应用案例,帮助读者更好地理解并运用这一强大的语言特性。不同于常规摘要,本文将以一个实际的软件开发场景引入,逐步揭示装饰器如何优化代码结构,提高开发效率和代码质量。
39 6
|
17天前
|
Python
如何提高Python代码的可读性?
如何提高Python代码的可读性?
30 4
|
17天前
|
Python
Python编程入门:从零开始的代码旅程
本文是一篇针对Python编程初学者的入门指南,将介绍Python的基本语法、数据类型、控制结构以及函数等概念。文章旨在帮助读者快速掌握Python编程的基础知识,并能够编写简单的Python程序。通过本文的学习,读者将能够理解Python代码的基本结构和逻辑,为进一步深入学习打下坚实的基础。
|
21天前
|
设计模式 监控 程序员
Python中的装饰器:功能增强与代码复用的利器####
本文深入探讨了Python中装饰器的工作原理、应用场景及其在提升代码可读性、减少重复劳动方面的优势。不同于传统方法的冗长和复杂,装饰器提供了一种优雅且高效的方式来增强函数或方法的功能。通过具体实例,我们将揭示装饰器如何简化错误处理、日志记录及性能监控等常见任务,使开发者能够专注于核心业务逻辑的实现。 ####
|
20天前
|
存储 设计模式 缓存
Python中的装饰器:代码的魔法增强剂####
本文将深入探讨Python语言中一个强大而灵活的特性——装饰器。不同于传统的函数调用,装饰器提供了一种优雅的方式来扩展或修改函数行为,无需直接修改原函数代码。我们将通过实例分析,揭示装饰器的定义、工作原理及其在实际项目中的应用价值,旨在帮助开发者更好地理解和利用这一高级功能,提升代码的可读性与维护性。 ####