在鄉下外婆家,我用手機跑完了那段 Python 腳本
pydroid3 是什麼
簡單說,pydroid3 是 Android 上的 Python 3.8 離線開發環境——整個 Python 解譯器、終端機、除錯器、還有一個語法高亮的編輯器,全部打包在一個 APK 裡,裝到手機就能直接寫、直接跑,不需要再折騰虛擬機或雲端解譯器。對平常靠筆電過活、但偶爾會被趕出書桌的人來說,它就是那張可以隨身塞進口袋的臨時寫字桌。
安裝
pydroid3 的 APK 安裝包約 73MB,版本號碼是 8.22_x86_64,在 Android 手機上安裝流程跟一般 APK 沒什麼兩樣:打開安裝程式、允許未知來源權限、點一下「安裝」就結束。比較特別的是首次啟動時它會花大約一分鐘在背景解壓 Python runtime 到 App 私有的資料目錄,這期間畫面上會顯示一個進度條,安裝包本身只是壓縮容器,真正的執行檔要解完才能用。
安裝完有一件事一定要先做:到 Android 系統設定裡把 pydroid3 的「所有檔案存取權限」打開。Android 11 之後強制分區儲存,如果沒給這項權限,程式碼裡用 open() 去讀 SD 卡或 Documents 目錄下的資料檔,會直接丟 PermissionError 或 FileNotFoundError——這不是你的腳本寫壞了,是系統規則卡住。pydroid3 自己在內部目錄寫檔沒問題,但要碰外面的 CSV、Excel 檔案,權限不放開就什麼都讀不到。
另外,把你的腳本檔案統一放在 /sdcard/Documents/Pydroid3/ 這個資料夾,這是 pydroid3 官方建議的位置,在這個路徑下的讀寫是百分之百穩定的,換了其他 App 也看得見,之後用文件管理 App 備份或分享都方便。
外婆家的臥室與一段未完成的腳本
事情要從端午前一天說起。我在實驗室做了一批植物生長的對照實驗,下午五點整理完數據,導師走過來拍拍我肩膀:「這批數據你幫我跑一下迴歸,要趕在明天下午組會議之前,我需要那張散佈圖。」我點點頭,把實驗筆電關上塞進背包——完全沒想起來我前一天把變壓器插在宿舍牆上忘了拔。
高鐵開了四十分鐘,我在外婆家的床上把筆電蓋子掀開,電池剩 2%。
好,那就手機吧。我打開 Google Play,搜尋 pydroid3,等 APK 裝好、解壓完 runtime,中間我還吃了兩顆外婆煮的鹹鴨蛋。
導師要的腳本說穿了就是把一份 CSV 讀進來,做三次 rolling mean,然後用 Matplotlib 畫張散佈圖疊上去。聽起來簡單,但我心裡有數,pydroid3 免費版裝科學類套件常常会卡 wheel 編譯——pip 裝到一半跳出錯誤訊息說 wheel 不存在,然後開始嘗試從源碼編譯,手機 CPU 滿載五分鐘最後還是失敗。

所以我做了第一件事:打開 pydroid3 裡面內建的 Terminal,先裝 pandas。
pip install pandas
好消息是 pandas 在 wheel 倉庫裡有現成的預編譯包,一行指令、兩秒鐘就裝上。接著是 Matplotlib——這才是真正的挑戰,因為 Matplotlib 在 Android 上不能用預設的 Agg 或 Qt 後端,彈圖窗會失敗。pydroid3官網 對此有專門處理:它內建了 Matplotlib 的 Kivy backend,只要檢測到 Kivy 可用,plt.show() 就會自動彈出一個 Kivy 視窗顯示圖表。
我按照之前在文件站看到的說明,先寫了一個十行的小測試腳本:
import matplotlib.pyplot as plt
x = list(range(10))
y = [i**2 for i in x]
plt.plot(x, y, marker='o')
plt.savefig("Documents/Pydroid3/test-chart.png")
圖檔成功保存了。用手機圖庫打開一看,線條、標記、標題都在,雖說手機螢幕只有六吋左右,看起來比電腦上小一圈,但至少數據和曲線沒有走樣。
實際跑起來才知道的幾件事
真的把導師的 CSV 讀進來之後,我遇到了兩個意料之外的坑。
第一個坑是中文字體。Matplotlib 在 Android 上預設找不到支援 CJK 的字型,我的散佈圖橫軸標籤用了中文,畫出來變成一排方框。這在文件站的樣本裡其實有提到,我當時沒往心裡去,直到自己踩了才想起來。解法其實很簡單:不要硬找字型檔,直接把橫軸標籤改成英文縮寫就行,實驗報告裡本來就會寫英文標籤,問題不大。
第二個坑是螢幕空間。在電腦上我可以把 Terminal 和編輯器左右分欄,一邊改 code 一邊看輸出;手機上只能上下切換,而且編輯器裡的按鈕、側欄、縮排指示都把可視空間擠得很小。我把字型大小調到 14pt(在 Settings → Appearance 裡),又把主題切到 Dark,這才勉強能在行號旁邊看清註解。這就是為什麼我一直說手機上的語法高亮比在電腦上更重要——電腦螢幕大,就算沒高亮也能靠縮排分層級;手機上一眼只能看到十幾行,顏色是你分辨字串、註解、內建函式的唯一視覺線索。

中間外婆進來送了一次切好的西瓜,我把剛才保存的散佈圖給她看了一眼,她說「這線彎彎曲曲的,是你們那個植物的什麼啊?」我說是生長速度對照。她點點頭把瓜放下,沒再問了。
一個小結
後來那張散佈圖我用 Telegram 傳回實驗室的群組,導師在回覆裡說「不錯,這個結果挺好」。外婆家的後院有一棵芒果樹,風吹過來的聲音比實驗室冷氣的嗡鳴好聽得多。
這次讓我對 pydroid3 改觀了——之前我總覺得它是個玩具,寫寫 LeetCode 簡單題還行,真要處理實際數據肯定會在裝套件那一步卡死。但這次的體驗讓我明白,只要你願意按照它的規則來(檔案放 Documents/Pydroid3、科學套件用 wheel 倉庫預編譯包、繪圖優先 savefig 而不是嘗試彈窗),它真的可以讓你在一台沒電源、沒網路、甚至可能沒筆電的情況下,把那段該跑的腳本跑起來。
當然它也有它的極限——如果你需要 PyTorch 完整 GPU 運算、或者要寫上萬行的大型專案,那手機終究不是筆電的替代品。但如果你的需求是「手上只有一台 Android 手機、有一段幾百行的 Python 腳本必須今晚跑完」,那 pydroid3 大概是目前你能找到的最省事的選擇。
我把那張散佈圖的 PNG 檔存在手機相簿裡,順手給 pydroid3 加了一個常用指令的備忘錄貼在冰箱上:pip install xxx、plt.savefig("Documents/Pydroid3/xxx.png")、open() 路徑永遠寫 Documents/Pydroid3/...。總之,下次如果再遇到這種狀況,我大概不會再手忙腳亂了。
本文為個人基於網路公開資料整理編寫,非官方內容,僅供學習交流參考;軟體版權歸原作者所有,請支持正版;使用過程中遇到問題請查閱官方管道,本文不承擔任何責任。