如何用iPad運行Python代碼?

其實,不僅是iPad,手機也能夠。python

痛點

我組織過幾回線下編程工做坊,帶着同窗們用Python處理數據科學問題。git

其中最讓人頭疼的,就是運行環境的安裝。github

實事求是地講,參加工做坊以前,我已經作了認真準備。web

例如集成環境,選用了對用戶很友好的Anaconda。docker

代碼在個人Macbook電腦上跑,沒有問題。還拿到學生的Windows 7上跑,也沒有問題。這才上傳到了Github。編程

在發佈的教程文章裏,我也已經把安裝軟件包的說明寫得很是詳細。瀏覽器

還針對 Anaconda 這一 Python 運行環境的安裝和運行,專門錄製了視頻服務器

可是,工做坊現場碰見的問題,依然五花八門。微信

有的是操做系統。例如你可能用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幾秒鐘。

而後,你就能看到熟悉的Python代碼運行界面了。

這個界面來自 Jupyter Lab。

你能夠將它理解爲 Jupyter Notebook 的加強版,它具有如下特徵:

  • 代碼單元直接鼠標拖動;
  • 一個瀏覽器標籤,可打開多個Notebook,並且分別使用不一樣的Kernel;
  • 提供實時渲染的Markdown編輯器;
  • 完整的文件瀏覽器;
  • CSV數據文件快速瀏覽
  • ……

圖中左側分欄,是工做目錄下的所有文件。

右側打開的,是我們要使用的ipynb文件。

爲了證實這不是逗你玩兒,請你點擊右側代碼上方工具欄的運行按鈕。

點擊一下,就會運行出當前所在代碼單元的結果。

不斷點擊下來,你能夠看見,結果都被正常渲染。

連圖像也能正常顯示。

甚至連下面這種須要必定運算量的可視化結果,都沒問題。

爲了證實這不是變魔術,你能夠在新的單元格,寫一行輸出語句。

就讓Python輸出你的名字吧。

假如你叫 Chuck,就這樣寫:

print("Hello, Chuck!")
複製代碼

把它替換成你本身的姓名,看看輸出結果是否正確?

其實,又何止是iPad而已?

你若是足夠勇(sang) 於(xin) 嘗(bing) 試(kuang),手機其實也是能夠的。

就像這樣。

流程

下面我給你講講,這種效果是怎麼作出來的。

咱們須要用到一款工具,叫作 mybinder 。它能夠幫助咱們,把 github 上的某個代碼倉庫(repo),快速轉換成爲一個可運行的環境。

注意 mybinder 爲咱們提供了雲設施,也就是計算資源和存儲資源。所以即使許許多多的用戶同時在線使用同一份代碼轉換出來的環境,也不會互相沖突。

咱們先來看看,怎麼準備一個可供 mybinder 順利轉換的代碼倉庫。

我爲你提供的樣例在這裏t.cn/R35MEqk):

順便說一句,這個樣例來自於個人數據科學系列教程之《如何用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 的網址mybinder.org/)。

在 「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」按鈕。

根據你的依賴安裝包數量等因素,你須要等待的時間長短不一。可是隻有第一次構建的時候,須要花一些時間。

之後每一次調用執行,就都會很是快了。

構建完畢後, mybinder 會自動爲咱們開啓對應的運行環境。

頗有成就感吧!

測試一下,可以正常運行代碼,就證實咱們成功了。

可是你會發現,不對啊!

老師你剛纔用 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
複製代碼

把它輸入到瀏覽器,看看出來的結果:

這下沒問題了吧?

原理

你是否是以爲,mybinder 很黑科技?

其實,也不算。

它只是把已有的幾項技術,連接了起來。

這大概也算是「積木式創新」的一個實例吧。

咱們看看 mybinder 的說明:

能夠看到,其中最爲關鍵的技術,是用了 docker 。

Docker 是個什麼東西呢?

簡單來講,Docker 就是爲了避免同平臺上,都可以順利執行同一份代碼的保障工具。

你有些猶疑,這說的不是 Java 嗎?

沒錯,Java 的宣傳口號,就是一次編碼,各處運行。

它利用虛擬機,來保障這種能力。

可是,若是你常用 Java 開發出來的工具,就應該瞭解痛點有哪些了。

至少,你應該對 Java 程序的運行速度,有一些體會。

上圖中,左側是虛擬機,右側是Docker。

Docker 不但效率上要強過 Java 虛擬機,並且它支持的編程語言也不只僅是一種。

至於其餘好處,我們就不展開了。不然聽起來像廣告。

其實,把 github 代碼倉庫轉換爲 docker 鏡像(image)的工做,也不是 mybinder 本身來作的。

它調用的,是另外的一個工具,叫作 repo2dockergithub.com/jupyter/rep…) 。

而你的瀏覽器可以執行 Python 代碼,是由於 Jupyter Notebook (或者Lab)原本就是創建在「瀏覽器/服務器」(Browser / Server, B/S)結構上。

若是你已經在本地計算機安裝過 Anaconda ,那不妨看看本地執行這個語句:

jupyter lab
複製代碼

會出現什麼?

對,它開啓了一個服務器,而後打開你的瀏覽器,跟這個服務器通信。

Jupyter 的這種設計,自己就讓它的擴展極爲方便。

不管 Jupyter 服務器是運行在你的本地筆記本上,仍是擺在另外一個大洲的機房,對你執行 Python 代碼來講,都是沒有本質區別的。

另外,若是你覺得 mybinder 只能讓你在瀏覽器上跑 Python 代碼,那就過小瞧它了。

學過 R 的同窗,請點擊這個連接(t.cn/R3JLY2S),看看有什麼驚喜。

小結

總結一下,本文爲你講述瞭如下內容:

  • 如何利用 mybinder ,把一個 github repo 一鍵轉換成 Jupyter Lab 運行環境;
  • 如何在各類不一樣操做系統的瀏覽器上,運行該環境,編寫、執行與修改代碼;
  • mybinder 轉換 github repo 的幕後英雄 docker 簡介。

我但願你能想到的,不只僅是這點兒簡單的用途。

提幾個問題給你,做爲思考題:

  • 若是代碼執行都在雲端完成,教學實驗室機房還有沒有必要預裝一大堆軟件,且不按期更新維護?
  • 學校的編程練習、做業和考試有沒有可能經過這種方式,直接遠程進行,而且自動化評分?
  • 既然應用的技術都是開源的,你有沒有可能利用這些開源工具搞個創業項目。例如提供深度學習環境,租賃給科研機構與創業公司?

期待你觸類旁通,作出有趣又有意義的創新來。

討論

在 iPad 上運行 Python 代碼的感受怎麼樣?你用過相似的產品嗎?你以爲有了這種技術,在平常工做和學習中,還能夠有哪些有趣的應用場景?歡迎留言,把你的經驗和思考分享給你們,咱們一塊兒交流討論。

若是你對個人文章感興趣,歡迎點贊,而且微信關注和置頂個人公衆號「玉樹芝蘭」(nkwangshuyi)

若是本文可能對你身邊的親友有幫助,也歡迎你把本文經過微博或朋友圈分享給他們。讓他們一塊兒參與到咱們的討論中來。

延伸閱讀

如何高效入門數據科學?

相關文章
相關標籤/搜索