如何用iPad運行Python代碼?
來自專欄 玉樹芝蘭
其實,不只是iPad,手機也可以。
痛點
我組織過幾次線下編程工作坊,帶著同學們用Python處理數據科學問題。
其中最讓人頭疼的,就是運行環境的安裝。
實事求是地講,參加工作坊之前,我已經做了認真準備。
例如集成環境,選用了對用戶很友好的Anaconda。
代碼在我的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 順利轉換的代碼倉庫。
我為你提供的樣例在這裡(http://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 enpython -m spacy download en_core_web_lgpython -m ipykernel install --user --name=wangshuyi
跟它的名字一樣。它是在 mybinder 依據 environment.yml
安裝了依賴組建後,依次執行的命令。如果你的代碼需要其他的命令提供環境支持,也可以放在這裡。
至此,你的準備工作就算結束了。
魔法表演正式開始。
請打開 mybinder 的網址(https://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 自己來做的。
它調用的,是另外的一個工具,叫做 repo2docker(https://github.com/jupyter/repo2docker) 。
而你的瀏覽器能夠執行 Python 代碼,是因為 Jupyter Notebook (或者Lab)本來就是建立在「瀏覽器/伺服器」(Browser / Server, B/S)結構上。
如果你已經在本地計算機安裝過 Anaconda ,那不妨看看本地執行這個語句:
jupyter lab
會出現什麼?
對,它開啟了一個伺服器,然後打開你的瀏覽器,跟這個伺服器通訊。
Jupyter 的這種設計,本身就讓它的擴展極為方便。
無論 Jupyter 伺服器是運行在你的本地筆記本上,還是擺在另一個大洲的機房,對你執行 Python 代碼來說,都是沒有本質區別的。
另外,如果你以為 mybinder 只能讓你在瀏覽器上跑 Python 代碼,那就太小瞧它了。
學過 R 的同學,請點擊這個鏈接(http://t.cn/R3JLY2S),看看有什麼驚喜。
小結
總結一下,本文為你講述了以下內容:
- 如何利用 mybinder ,把一個 github repo 一鍵轉換成 Jupyter Lab 運行環境;
- 如何在各種不同操作系統的瀏覽器上,運行該環境,編寫、執行與修改代碼;
- mybinder 轉換 github repo 的幕後英雄 docker 簡介。
我希望你能想到的,不僅僅是這點兒簡單的用途。
提幾個問題給你,作為思考題:
- 如果代碼執行都在雲端完成,教學實驗室機房還有沒有必要預裝一大堆軟體,且不定期更新維護?
- 學校的編程練習、作業和考試有沒有可能通過這種方式,直接遠程進行,並且自動化評分?
- 既然應用的技術都是開源的,你有沒有可能利用這些開源工具搞個創業項目。例如提供深度學習環境,租賃給科研機構與創業公司?
期待你舉一反三,做出有趣又有意義的創新來。
討論
在 iPad 上運行 Python 代碼的感覺怎麼樣?你用過類似的產品嗎?你覺得有了這種技術,在日常工作和學習中,還可以有哪些有趣的應用場景?歡迎留言,把你的經驗和思考分享給大家,我們一起交流討論。
如果你對我的文章感興趣,歡迎點贊,並且微信關注和置頂我的公眾號「玉樹芝蘭」(nkwangshuyi)。
如果本文可能對你身邊的親友有幫助,也歡迎你把本文通過微博或朋友圈分享給他們。讓他們一起參與到我們的討論中來。
延伸閱讀
如何高效入門數據科學?
推薦閱讀:
※Leetcodes Solution 36 Valid Sudoku
※C語言基礎:指針數組與數組指針
※把文本格式的HEX文件轉換為二進位文件
※如何學習C語言
※Learn to code from good webs