Ubuntu 22.04 安装 Anaconda 与 Jupyter 避坑实战
Ubuntu 22.04 上把 Anaconda 和 Jupyter Notebook 搭起来听起来像是新手入门的第一课但真正动手过的人都知道这套组合的坑几乎全藏在细节里安装脚本跑完 conda 命令不认、base 环境每次开终端自动激活拖慢启动、Jupyter 生成完配置文件却连不上内核、笔记本里敲一行代码点运行转半天没反应。我自己在 Ubuntu 22.04 LTS 上反复装过十几遍这套环境虚拟机装过、物理机装过、也给同事远程调过最后沉淀下来的这套流程基本能保证从零到能跑 PyTorch 代码不超过四十分钟。这篇内容就是把这四十分钟里每一步的取舍和暗坑都摊开讲清楚适合刚接触 Linux 想搭 Python 科学计算环境的同学也适合已经装过一两次但总在某个环节翻车的老手对着排错。1. 动手之前先想清楚为什么是 Anaconda 而不是裸 pip1.1 三套方案的实际取舍系统 Python、venv、CondaUbuntu 22.04 出厂就带了 Python 3.10.6很多人第一反应是直接用系统的解释器配 pip 装包。这条路在特别简单的场景下确实能走通但只要你开始碰 NumPy、SciPy、PyTorch 这类带 C/C 扩展和 BLAS 后端的库很快就会被编译依赖折腾到怀疑人生。系统 Python 还有一个更隐蔽的问题Ubuntu 自身的很多桌面组件和 apt 包都依赖/usr/bin/python3你在这个解释器里随便升级或者降级某个包有可能把系统工具搞坏。我自己刚学 Linux 那会儿就干过用 sudo pip 往系统 Python 里装东西的事后来系统设置面板直接打不开只能重装。venv是官方推荐的隔离方案比裸 pip 干净得多创建虚拟环境也快。但它的短板在于只管 Python 包不管底层二进制库。举个例子你要装 PyTorch 的 GPU 版本CUDA 相关的运行时库得自己处理你要装 OpenCV可能还得先在系统上apt install libgl1。换句话说venv 解决的是包冲突没解决依赖地狱。Conda 的思路不太一样它管的不只是 Python 包还包括编译器、BLAS、CUDA runtime、甚至 R 语言和 Node.js 的包全都打包成预编译好的二进制装在独立目录里跟系统彻底隔离。代价是体积大、环境目录动辄几个 G。所以选型逻辑很直白做数据科学、机器学习、需要频繁切换不同框架版本用 Conda写个 Flask 小服务或者做纯 Python 后端venv 足够至于直接动系统 Python除非你明确知道自己在干什么否则不要。1.2 那 Miniconda 能不能替代 Anaconda这是个被问得最多的问题。Anaconda 完整版安装包接近 1G装完占 3 到 5G里面预装了 Spyder、Jupyter、NumPy、Pandas、Matplotlib 一大堆东西。Miniconda 只有几十兆装完就一个 conda 加一个 python其他全靠自己装。我的建议是分场景如果你机器磁盘紧张或者已经习惯了用 pip 装包、只需要 conda 提供环境隔离能力Miniconda 更清爽装完就是白纸一张不会有一堆你永远用不到的包占着地方。但如果你是新手第一次搭环境Anaconda 更省事因为它的 base 环境里已经把 Jupyter、科学计算三件套都装好了装完就能跑。我目前自己的机器上用的是 Miniconda因为我会在不同项目里分别装精确版本的库base 环境保持极简能避免很多版本冲突的干扰。但给同事配开发机的时候我一般直接上 Anaconda少解释一堆东西。还有一个容易被忽略的点这两个东西本质上不冲突但不要在同一台机器上同时装 Anaconda 和 Miniconda因为它们都会往~/.bashrc里写路径PATH 里出现两个 conda 会导致各种诡异问题比如conda activate找不到环境、which python指向错的地方。要换就直接卸掉旧的再装。1.3 Ubuntu 22.04 这个版本本身的几个注意点22.04 是 LTS 长期支持版桌面环境和内核都比较新对这套环境是友好的。但有两个地方值得提前知道。第一22.04 默认没有安装openssh-server。这条和后面 Jupyter 的远程访问直接相关——你想在笔记本上连台式机的 Jupyter最安全的方式其实是通过 SSH 端口转发而不是把 8888 端口直接开出去。所以装完系统第一件事应该是sudo apt install openssh-server然后确认systemctl status ssh是 active。第二如果你是在 VMware 或者其他虚拟机里跑 Ubuntu 22.04建议装一下open-vm-tools和open-vm-tools-desktop共享文件夹和剪贴板会好用很多。虚拟机里跑 Jupyter 还有个细节默认网卡是 NAT 模式的话宿主机访问虚拟机的 8888 端口需要额外配置端口映射改成桥接模式会简单一些但会占用一个局域网 IP。这两个方式各有取舍我一般用 NAT 加端口转发因为不依赖路由器分配。2. 安装前的准备工作磁盘、依赖和校验2.1 系统更新与基础依赖正式装之前先把系统更新一遍尤其是那些和 Python 相关的库。命令很简单sudo apt update sudo apt upgrade -y sudo apt install -y wget curl bzip2 ca-certificates gitbzip2这个包必须装。Anaconda 的安装包是.sh格式但没有用 tar 打包的压缩包内部解压过程会调用 bzip2缺了它会报出很难懂的错。ca-certificates是为了后面用 HTTPS 访问镜像站和 pip 源做准备缺了会提示证书验证失败。磁盘空间方面Anaconda 安装本身需要至少 5G 可用空间如果后面还要建几个带 PyTorch 的环境建议留出 20G 以上。用df -h看一下根分区如果/home是独立分区就更好了Anaconda 默认装在家目录下占用的是 home 的空间。我吃过一次亏笔记本根分区只分了 30G装了 Anaconda 加三个环境之后系统更新都做不了清理缓存才勉强腾出空间。还有个细节值得提一下不要把 Anaconda 装在/opt或者/usr/local下面。有人觉得这样全局可用但后续所有包都以 root 权限安装一是安全上有隐患二是当你需要sudo才能改环境的时候权限问题会把你折磨疯。装在家目录所有操作都用普通用户完成是最省心的。2.2 安装包从哪来怎么确认没被改过Ubuntu 环境下下载 Anaconda 有两条路官方站和国内镜像站。官方站下载速度在国内某些网络条件下不太理想尤其完整版接近 1G断了还得重来。清华开源软件镜像站提供了 Anaconda 的完整归档速度稳定推荐优先用。登录镜像站的 anaconda/archive 目录找最新的 Linux x86_64 版本比如Anaconda3-2024.10-1-Linux-x86_64.sh。文件名里的3指的是 Python 3后面的日期是发行版本号。注意不要下成Linux-aarch64的那是给 ARM 架构用的在普通 x86 机器上跑不起来。下载完之后一定要校验哈希值。这不是多此一举大文件下载中途出错的概率比你想的高而且一个损坏的安装包解压到一半报错你根本想不到是包的问题。操作是这样sha256sum Anaconda3-2024.10-1-Linux-x86_64.sh把输出的那串十六进制字符和官方归档目录里同名.sha256文件中的值比对。不一致就重新下别抱着侥幸心理硬装。我见过一次同事装到一半报 tar: Unexpected EOF in archive折腾了一个多小时才想起来是下载不全。3. Anaconda 安装全流程拆解3.1 执行安装脚本与路径选择安装命令本身很简单但参数怎么给有讲究。推荐这样写bash Anaconda3-2024.10-1-Linux-x86_64.sh -b -p $HOME/anaconda3-b是批处理模式不交互省得你一直按回车看许可协议。-p指定安装路径这里显式写成$HOME/anaconda3。为什么不用默认路径因为默认会装到~/anaconda3其实一样但显式写出来的好处是你在脚本里复用的时候不会搞混。而且以后如果要做备份或者迁移路径是明确的。如果你不加-b脚本会问你几个问题其中最后一个是 Do you wish the installer to initialize Anaconda3 by running conda init?默认是 no。这时候如果直接回车装完之后conda命令是找不到的你还得手动改.bashrc。所以我一般直接用-b装完再手动 init每一步都在自己控制下。安装过程大概两到五分钟取决于磁盘速度。跑完之后先别急着开新终端执行一下source ~/.bashrc或者干脆exec bash -l开一个新的登录 shell。然后验证conda --version which conda正常的话应该输出类似conda 24.9.2和/home/你的用户名/anaconda3/bin/conda。3.2 conda init 到底改了什么很多人装完就用从没看过conda init动了哪里出问题的时候就抓瞎。实际上它就是在~/.bashrc末尾插了一段由# conda initialize 和# conda initialize 包裹的 shell 函数定义核心是定义了一个conda函数并在每次启动交互式 shell 时执行conda activate base。理解这一点很重要因为后面所有conda 命令找不到、激活环境没反应的问题几乎都能从这段代码里找到答案。比如你在服务器上跑非交互式的脚本.bashrc根本不执行conda 就不会被初始化。再比如你用 zsh 或者其他 shellconda init bash是没用的得改成conda init zsh。还有个常见误区有人为了干净手动把这段代码删掉然后发现 conda 用不了。正确的做法不是删而是通过配置把 base 的自动激活关掉这就要说下一节了。3.3 base 环境自动激活关还是留每次打开终端都自动进入(base)环境这件事评价两极分化。好处是你随时可以用 conda 命令pip 装的东西也在可控范围内。坏处也很明显base 环境里的 Python 会覆盖系统的 Python你敲python得到的不是系统那个某些依赖系统 Python 的脚本可能因此行为异常另外每次开终端都会跑一遍 conda 的初始化逻辑稍微慢一点。我的做法是关掉自动激活需要的时候手动 activateconda config --set auto_activate_base false执行完重开终端提示符前面的(base)就没了。这时候conda命令依然可用因为它是个 shell 函数不依赖环境是否激活。要进 base 就conda activate base要退出就conda deactivate。这里有个特别容易踩的坑关掉自动激活之后有人发现自己python命令指向系统 Python然后 pip 装包装到了系统环境里。解决办法是养成习惯装包之前先看提示符或者用which python确认一下。更稳妥的做法是把系统 Python 彻底不动所有项目都建独立环境。3.4 换源把下载速度提上来默认的 conda 源在国外装个 PyTorch 可能等到天荒地老还超时。换源不是可选项是必做项。先设置一下显示源地址conda config --set show_channel_urls yes然后编辑~/.condarc文件把内容改成channels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud这里有个细节要注意尽量不要在channels列表里加conda-forge或者pytorch而是通过custom_channels映射。原因是如果你在 channels 里混排多个源conda 的依赖求解器会在所有源里搜索遇到同名包版本不一致的时候求解时间会指数级增长有时候卡在 Solving environment 十几分钟不动。用custom_channels的方式只有当你显式-c pytorch的时候才会去那个源找。pip 的源也顺手配一下因为 conda 装不到的包还是要靠 pippip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple配完之后清一下缓存验证速度conda clean -i conda install numpy能几秒钟装完就说明源生效了。4. Jupyter Notebook 的安装与配置详解4.1 三种安装方式与版本选择如果你的 base 环境里有 Jupyter完整版 Anaconda 自带可以直接跳到配置。如果是 Miniconda 或者你想在独立环境里装有三种方式第一种conda install jupyter notebookconda 会把 notebook、jupyter_core、jupyter_client、ipykernel 这些依赖一起装好版本之间经过测试最省心。第二种pip install notebook装的是 PyPI 上的版本通常更新更快但偶尔会遇到依赖版本不匹配。第三种只装jupyterlab它是 Notebook 的下一代界面功能和 Notebook 兼容界面更像 IDE。我的建议是在新环境里先 conda 装conda 装不上的再 pip 补。原因是 conda 装的包会记录在环境的元数据里conda list能看到卸载的时候也更干净。pip 装进 conda 环境虽然能用但 conda 不知道这些包的存在做环境导出的时候会漏掉。版本方面有个必须知道的坑Jupyter Notebook 从 7.0 开始做了大改底层从 notebook server 换成了 jupyter-server配置文件里的配置项前缀从NotebookApp变成了ServerApp。所以你在网上搜到的很多老教程写着c.NotebookApp.ip *在 Notebook 7 里是失效的得改成c.ServerApp.ip 0.0.0.0。判断自己在用哪个版本jupyter notebook --version jupyter server --version如果 notebook 版本是 7.x配置文件里就用ServerApp。4.2 生成配置文件与设置访问密码装完之后第一步是生成默认配置文件jupyter notebook --generate-config它会告诉你文件写在哪里通常是~/.jupyter/jupyter_notebook_config.py。这个文件特别长全是注释直接滚到底部加配置就行。第二步是设置密码。以前的老办法是在配置文件里写c.NotebookApp.password sha1:xxx还得手动算哈希现在直接用命令jupyter notebook password它会让你输两次密码然后把加密后的结果写进~/.jupyter/jupyter_server_config.json。注意这个文件和配置文件是两个东西密码存在 json 里配置项存在 py 里互不干扰。这里有个非常常见的困惑设完密码本地打开 Jupyter 还是不用密码就能进。这不是出错了是因为访问localhost的时候 Jupyter 认为是本地可信连接默认不校验密码。只有从其他机器访问才会要求登录。想强制本地也验密码需要在配置里加c.ServerApp.token 并确保password已设置但说实话没必要本地开发加密码纯属给自己添堵。4.3 远程访问配置逐行说清楚如果你只在本地用上面的配置就够了。但如果想在局域网内另一台设备上访问比如台式机跑计算笔记本连过去写代码需要改几个配置项。在配置文件末尾加上c.ServerApp.ip 0.0.0.0 c.ServerApp.port 8888 c.ServerApp.open_browser False c.ServerApp.allow_remote_access True c.ServerApp.root_dir /home/你的用户名/notebooks c.ServerApp.allow_root False逐行解释一下为什么这么配。ip 0.0.0.0是监听所有网卡如果写127.0.0.1就只有本机能连。open_browser False是因为服务器上没有图形界面不关掉每次启动都会报找不到浏览器的警告。allow_remote_access是为了让 jupyter-server 的 Host 校验放行不加这个从别的 IP 访问会返回 403。root_dir指定工作目录我习惯单独建一个notebooks目录避免打开 Jupyter 满屏都是家目录的各种隐藏文件。重启服务之后不要直接把端口开到公网。这是最重要的一条。Jupyter 本身有登录机制但它的安全边界并没有设计成暴露在互联网上的强度。正确做法是内网用或者用 SSH 端口转发ssh -L 8888:localhost:8888 用户名服务器IP这样你在本地浏览器访问localhost:8888流量会通过 SSH 通道转发到服务器。服务器那边配置成ip 127.0.0.1就行外面完全看不到 8888 端口。局域网直接访问的话记得开防火墙sudo ufw allow from 192.168.1.0/24 to any port 8888只放行自己所在的网段别用sudo ufw allow 8888把整个互联网都放进来。4.4 用 systemd 管起来省得每次手动启手动在终端里跑jupyter notebook的问题是关掉终端进程就没了。用 systemd 可以做到开机自启、崩溃自动重启、日志统一管理。新建一个服务文件sudo nano /etc/systemd/system/jupyter.service内容如下[Unit] DescriptionJupyter Notebook Server Afternetwork.target [Service] Typesimple User你的用户名 WorkingDirectory/home/你的用户名/notebooks ExecStart/home/你的用户名/anaconda3/bin/jupyter notebook --config/home/你的用户名/.jupyter/jupyter_notebook_config.py Restartalways RestartSec5 [Install] WantedBymulti-user.target几个关键点User必须写你的普通用户名不能留空否则会以 root 跑allow_root那个配置就会拦住你。ExecStart里 jupyter 的路径要写绝对路径因为 systemd 不走你的.bashrcPATH 里没有 conda 的东西写jupyter会报 command not found。Restartalways保证内核崩了服务能自己拉起来。启用sudo systemctl daemon-reload sudo systemctl enable jupyter sudo systemctl start jupyter sudo systemctl status jupyter看日志用journalctl -u jupyter -f这个比在终端里看输出方便多了。5. 虚拟环境与 Jupyter 内核打通的完整套路5.1 建环境、装 ipykernel、注册内核Jupyter 装好了不代表它能用你的项目环境。默认情况下Jupyter 里的 Python 内核是 base 环境那个你新建一个 conda 环境装了一堆包在 Jupyter 里根本选不到。这一步是新手最容易卡住的地方流程其实就三步。以建一个 PyTorch 环境为例conda create -n torch python3.10 -y conda activate torch conda install pytorch torchvision torchaudio pytorch-cuda11.8 -c pytorch -c nvidia conda install ipykernel python -m ipykernel install --user --name torch --display-name Python (PyTorch)第一步建环境的时候指定 Python 版本这很重要因为很多库对 Python 版本有硬性要求用默认的最新版经常碰壁。PyTorch 目前对 3.10 和 3.11 支持最好所以我一般指定 3.10。第三步装ipykernel是关键它是 Jupyter 和 Python 解释器之间的桥梁。缺了它就算你把环境注册进去Jupyter 也启动不了内核界面上会一直显示内核正在启动然后超时。第四步python -m ipykernel install注意这里用python -m而不是直接敲ipykernel是为了确保调用的是当前激活环境里的那个 ipykernel而不是 base 里的。--user表示装到用户级目录~/.local/share/jupyter/kernels/不加这个参数会尝试装到环境自身的目录有时候权限会出问题。--name是内核的内部标识--display-name是 Jupyter 界面下拉菜单里显示的名字我习惯把框架名写进去环境多了以后一眼就能分辨。验证一下jupyter kernelspec list应该能看到python3base 的和你新注册的torch。5.2 内核管理的几个常用操作注册完之后常用的操作有这么几个。删掉某个内核jupyter kernelspec remove torch注意这个操作只是删掉内核注册信息不会删除 conda 环境本身环境还在只是 Jupyter 里看不到了。改显示名字不用重新注册直接编辑内核目录下的kernel.jsonnano ~/.local/share/jupyter/kernels/torch/kernel.json里面display_name字段改一下就行重启 Jupyter 生效。还有个小技巧如果你想让某个内核固定使用特定的启动参数比如设置环境变量可以在kernel.json的env字段里加{ argv: [/home/user/anaconda3/envs/torch/bin/python, -m, ipykernel_launcher, -f, {connection_file}], display_name: Python (PyTorch), language: python, env: { CUDA_VISIBLE_DEVICES: 0, OMP_NUM_THREADS: 4 } }CUDA_VISIBLE_DEVICES在多卡机器上特别有用可以限制某个内核只用某张卡。5.3 一套环境跑通之后怎么复制到别的机器辛辛苦苦配好的环境换台机器不想重来一遍这时候环境导出就派上用场了。conda 环境导出有两种粒度conda env export environment.yml这个命令导出的是完整环境包含所有包的精确版本号甚至连 conda 的 build string 都记下来了。好处是复现度高坏处是换到不同操作系统或者不同架构上可能装不上因为 build string 是平台相关的。另一种是只导出手动装过的包conda env export --from-history environment.yml这个文件干净得多只有你明确conda install过的那些包重建的时候 conda 会自己求解依赖。我自己更习惯用这个方式因为跨平台兼容性好。再补充一个pip freeze requirements.txt作为 pip 包的备份。重建的时候conda env create -f environment.yml有个坑要提醒environment.yml里的name字段是环境名如果目标机器上已经有同名环境会报错可以加-n 新名字覆盖。还有如果 yml 里包含了当前机器的 channels 配置可能指向本地路径跨机器时要手动清理一下。6. 实战踩坑记录与排查速查表6.1 Jupyter 打不开、页面空白、单元格点了没反应这三类问题占了 Jupyter 报障的八成而且表现相似但原因完全不同。打不开分两种。如果浏览器提示无法访问此网站先看服务有没有起来systemctl status jupyter或者看终端有没有报错。常见原因是端口被占了ss -tlnp | grep 8888看看谁在用。另一个高频原因是配置文件里ip写成了0.0.0.0但防火墙没放行本地用localhost访问反而失败因为某些系统上0.0.0.0和localhost的路由行为不一致改成127.0.0.1试一下就能定位。页面白屏通常是前端资源加载失败。打开浏览器开发者工具的 Network 面板看看是哪些请求红了。如果是main.js之类的静态资源 404多半是 notebook 版本和 jupyter-server 版本不匹配卸载重装一遍通常能解决pip install --upgrade --force-reinstall notebook jupyter-server单元格执行没反应这个最折磨人。界面显示[*]一直转或者干脆没有任何反应。按可能性排序第一内核根本没启动看右上角的内核状态指示灯如果是空心圆说明没连上重启内核试试第二ipykernel和jupyter_client版本不兼容这个是老问题pip install --upgrade jupyter_client ipykernel一般能修第三浏览器插件拦截了 WebSocket 连接某些隐私保护类插件会干这事换个浏览器或者无痕模式验证一下第四如果你在用反向代理或者负载均衡WebSocket 升级请求被丢掉了这个得在中间层配置里放行Upgrade头。我遇到过一次特别隐蔽的单元格执行没反应查了半天发现是/tmp空间满了内核的通信文件写不进去。df -h /tmp一看果然是 100%清掉之后立刻恢复。所以排查这类问题时看一眼磁盘和内存也是必要的。6.2 DLL load failed while importing rpds 这类内核启动报错这个报错原文是ImportError: DLL load failed while importing rpds: 找不到指定的模块严格说这是 Windows 上的典型问题因为rpds是个 Rust 写的包Windows 上需要对应的运行时库。但很多人在 Ubuntu 上也会遇到它或者它的变种因为 conda 和 pip 混装导致的二进制不兼容会引发类似的导入失败。Ubuntu 下的触发场景主要有两个。第一你用了 conda 装的 jupyter 和 pip 装的rpds-py两者链接的 libc 版本不同import rpds的时候动态库解析失败。解决方式是统一来源conda install -c conda-forge rpds-py或者干脆把 pip 装的那个卸掉重装pip uninstall rpds-py -y pip install --no-cache-dir rpds-py第二你的 glibc 版本过旧比你 pip 装的 wheel 要求的版本低。ldd --version看一下Ubuntu 22.04 是 2.35一般够用但如果你是从 18.04 升级上来的老系统可能会出问题。这种情况建议不要在旧系统上硬撑升级系统或者用 conda 装预编译版本更省事。排查这类导入错误有个通用套路先用python -c import rpds在环境里直接测如果这里就报错说明是环境本身的问题如果这里能过但 Jupyter 里报错说明是内核路径指向错的环境了用jupyter kernelspec list确认一下内核路径对不对。6.3 环境变量、SSH 和虚拟机相关的连带问题环境变量配置错误是另一个高频坑。最常见的表现是conda: command not found但明明装过了。原因通常是你改过.bashrc之后没source或者是你在 non-login shell 里操作.bashrc不会被执行。判断方法是echo $PATH看看有没有 Anaconda 的 bin 目录。如果确实没有重新conda init一次然后source ~/.bashrc。还有一种情况是你在.bashrc里手动加 PATH 的时候加错了顺序导致系统 Python 优先于 condawhich python会露馅。SSH 连不上如果你是通过 SSH 连到服务器再配环境这个问题会直接卡住整个流程。Ubuntu 22.04 默认没装 openssh-serversudo apt install openssh-server装上然后sudo systemctl enable --now ssh。如果装了还连不上检查防火墙sudo ufw status看 22 端口有没有放行。虚拟机里还有个特殊情况网络模式是 NAT 的时候宿主机访问虚拟机的 22 端口需要做端口映射桥接模式则直接可用。我一般把虚拟机设成桥接给个局域网 IP省得每次都配映射。虚拟机里跑 Jupyter 变慢是另一个容易被忽略的点。VMware 默认给虚拟机的显存和 CPU 核心数比较保守Jupyter 前端渲染和内核计算都会受影响。把处理器核心调到和物理机一致内存给到 8G 以上勾选虚拟化 Intel VT-x/EPT体感会好很多。另外虚拟机里不要开 3D 加速某些驱动版本下反而会导致浏览器渲染异常。6.4 常见问题速查表现象最可能的原因优先尝试的解决方式conda: command not found未执行 conda init 或未 sourceconda init bash后source ~/.bashrc终端启动慢、每次进 basebase 自动激活未关闭conda config --set auto_activate_base falseconda install卡在 Solving environmentchannels 列表混排多个源改用 custom_channels显式-c指定源Jupyter 页面打不开端口占用或监听地址错误ss -tlnp | grep 8888改ip为127.0.0.1从别的机器访问返回 403Host 校验未放行配置c.ServerApp.allow_remote_access True下拉菜单没有自定义环境未注册内核或注册错环境激活环境后python -m ipykernel install --user单元格一直显示[*]内核未启动或 ipykernel 不兼容重启内核升级ipykernel jupyter_clientImportError: ... rpdsconda 与 pip 混装导致二进制冲突统一用 conda-forge 装rpds-py内核日志报/tmp写入失败临时目录空间不足df -h /tmp清理后重启内核SSH 无法连接未安装 openssh-server 或防火墙拦截apt install openssh-server检查 ufw配置文件改了不生效Notebook 7 用了旧前缀把NotebookApp改成ServerApp环境导出后别的机器装不上build string 平台相关用--from-history导出精简版7. 让日常使用更顺手的几个配置7.1 代码自动补全与 Markdown 目录Jupyter 默认的补全能力比较基础只补变量名和部分函数名。想要更好的体验最轻量的方案是装jupyterlab-lsp加python-lsp-server但配置略复杂。更简单的办法是在 Notebook 里用内置的 Tab 补全配合%config Completer.use_jedi False切换补全引擎有时候能解决补全不出来的问题。Markdown 目录这个需求很常见写长笔记的时候没有目录翻起来很痛苦。Notebook 7 原生支持在侧边栏显示目录点左侧那个列表图标就行不需要装扩展。如果你是 Notebook 6需要装jupyter_contrib_nbextensions然后启用toc2命令是conda install -c conda-forge jupyter_contrib_nbextensions jupyter contrib nbextension install --user jupyter nbextension enable toc2/main装完重启工具栏会多出一个目录按钮。另外toc2还支持把目录导出成 Markdown写文档的时候挺有用。7.2 终端字体和编辑器工作流Ubuntu 22.04 默认的终端字体是 Ubuntu Mono看着还行但长时间敲代码眼睛容易累。如果追求接近 macOS 那种细腻的等宽字体体验推荐几个免费可商用的JetBrains Mono 圆润清晰连字ligature做得克制Fira Code 连字更夸张!和会合成一个符号有人喜欢有人嫌Cascadia Code 是微软出的字形偏窄一行能塞更多字符。装完字体之后在终端首选项里换掉顺便把字号调到 13 到 14行高 1.2 倍长时间用舒服很多。至于用 nvim 写 Jupyter 的工作流我自己的做法是把 ipynb 用 jupytext 转成 py 脚本在 nvim 里编辑跑的时候再转回去。这种方式的好处是能用上完整的 LSP、格式化、Git diff 也友好因为 py 是纯文本。配置不复杂pip install jupytext jupytext --set-formats ipynb,py:percent notebook.ipynb之后这个 notebook 会同时维护两个文件改哪个都行Jupyter 里刷新就能看到 nvim 的修改。注意py:percent格式会在代码块之间插入# %%分隔标记这是让 Jupyter 识别单元格边界用的别手动删掉。需要提醒的是这套工作流有两个前提一是文件放本地网盘同步目录容易因为文件锁产生冲突二是不要同时在 Jupyter 和 nvim 里改同一个单元格jupytext 虽然有检测机制但偶尔会丢改动。我自己用了大半年唯一翻车的一次就是两边同时编辑后来养成习惯要么在浏览器里改要么在 nvim 里改不在两边来回切。这套环境我最开始在虚拟机上装了三遍才理顺后来在物理机上重装只花了二十分钟中间最大的时间开销其实不是安装本身而是等下载。踩过的坑里印象最深的是第一次换了 conda 源却没清缓存结果 conda 还是从老源拉包卡了半小时才反应过来要conda clean -i。所以我现在装完第一件事就是清缓存加验证速度确认源真的生效了再往下走。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →