手机运行Jupyter Notebook有两条路径:本地直跑(Pydroid 3安装jupyter并用Chrome访问http://127.0.0.1:8888)或远程访问(需配置服务器防火墙、云安全组及c.NotebookApp.allow_remote_access=True)。

手机上运行 Jupyter Notebook 有两条清晰路径:本地直跑(无网络依赖,但受限于性能和存储),或远程访问(依赖云服务器或电脑,体验更接近桌面)。没有“一键安装即用”的万能方案,选哪条取决于你手头有没有可长期开机的 Linux 机器(比如闲置旧电脑、云服务器)。
Pydroid 3 本地启动 jupyter notebook 的实操要点
Pydroid 3 是目前 Android 上最成熟的 Python 运行环境,支持直接 pip install jupyter 并启动服务。但它不是点开图标就进 Notebook 的图形应用——本质是终端驱动的本地 Web 服务。
- 必须先在 Pydroid 3 的 Pip 界面中完整安装
jupyter,不能只装ipykernel或notebook单独包;缺依赖时会报ModuleNotFoundError: No module named 'jinja2'或类似错误,此时要补装jinja2、pyzmq、tornado - 启动命令必须是
jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser --allow-root,否则默认绑定127.0.0.1,手机浏览器打不开 - Pydroid 3 自带浏览器不支持 WebSocket,务必用 Chrome/Firefox 打开输出的
http://127.0.0.1:8888链接;若提示“连接被拒绝”,检查是否开了“允许后台进程”权限(Android 12+ 尤其关键) - 文件存放在
/data/data/ru.iiec.pydroid3/files/home/下,Finder 类文件管理器无法直接跳转,建议用 Pydroid 终端执行cd ~ && mkdir notebooks && cd notebooks后再启动
Aid Learning 中 Jupyter 的路径与文件传输陷阱
Aid Learning 提供的是完整 Debian 桌面环境,Jupyter 默认工作目录是 /home,但它的文件系统桥接机制容易让人误判路径归属。
- 手机外部存储(即
/sdcard)在 Aid Learning 里挂载为/sdcard,不是/home/sdcard;想把电脑传来的analysis.ipynb放进 Jupyter 可见目录,得用 Finder 复制到/home/,而不是复制进/sdcard/jupyter/再软链 - 启动 Jupyter 前必须确保
/home目录有写权限,否则会卡在[W 12:45:22.111 NotebookApp] Permission denied: /home/.jupyter;临时解法是终端执行sudo chown -R $(whoami) /home - 界面缩放问题不是浏览器导致的,而是 Aid Learning 的 X11 分辨率未适配高 PPI 屏幕;修改
/etc/X11/xorg.conf.d/10-monitor.conf加入Option "Scale" "2"可缓解,但重启后可能失效
远程访问时最常被忽略的端口与安全组配置
哪怕你在服务器上成功运行了 jupyter notebook --no-browser --port=8888 --ip=0.0.0.0,手机依然连不上,90% 是因为没打通“三层关卡”:
- 第一层:服务器防火墙(如
ufw或iptables)必须放行 8888 端口,ufw allow 8888不等于生效,还要ufw enable - 第二层:云厂商安全组(阿里云/腾讯云)需显式添加入方向规则,协议选 TCP,端口填
8888/8888,源 IP 建议设为0.0.0.0/0(测试用),不能只靠“默认放行全部” - 第三层:Jupyter 配置里
c.NotebookApp.allow_remote_access = True必须为True(注意不是allow_origin),且c.NotebookApp.password必须是sha1:xxx格式密文,明文密码会直接启动失败
真正麻烦的从来不是启动命令本身,而是每层抽象(Android 权限模型、Linux 文件权限、云网络策略)都在悄悄吃掉一个预期路径。调试时别盯着 jupyter 日志看,先确认 curl -v http://localhost:8888 在服务器本地能通,再查手机能否 ping 通服务器 IP,最后才动 Jupyter 配置——顺序错了,三天都找不到那个漏掉的 =True。


















