ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Anaconda虚拟环境注册到Jupyter及远程访问开机自启全攻略

Anaconda虚拟环境注册到Jupyter及远程访问开机自启全攻略 如果你和我一样电脑里用 Anaconda 装了不下五六个 Python 环境平时跑深度学习用一个 env处理数据用另一个 env偶尔写点自动化脚本又得切回 base——那大概率遇到过同一个尴尬Anaconda 里环境建得明明白白一打开 Jupyter Notebook / Jupyter Lab内核列表里只有孤零零一个Python 3 (ipykernel)想用哪个环境还得手动开终端、conda activate、再硬着头皮用命令行跑代码。这篇文章就是来解决这个痛点的。我会从原理到实操讲清楚三件事怎么把 Anaconda 里创建好的虚拟环境注册进 Jupyter Notebook / Jupyter Lab怎么配置远程访问让浏览器能连上主机上的 Notebook 服务最后再给出 Windows 和 Linux 两套开机自启方案让 Jupyter 服务跟着系统一起启动省掉每次手动敲命令的麻烦。整个过程我已经在本地和服务器上反复验证过多次照着下面步骤走基本不会踩坑。1. 内容整体设计与思路拆解1.1 先搞懂 Jupyter 的“内核”机制先说个容易忽略的背景。很多人以为 Jupyter Notebook 左上角显示的Python 3就是当前所有环境的 Python其实不是。Jupyter 的前端页面也就是你在浏览器里看到的 Notebook 界面和执行代码的后端是分离的后端负责真正运行代码的进程叫“内核”Kernel。内核本质上就是一个特定 Python 解释器加一组通信协议。Anaconda 里每创建一个虚拟环境就等于装了一套独立的 Python 解释器和独立的第三方库集合。默认情况下安装 Anaconda 时自带的 Jupyter 只知道 base 环境的内核所以你新建的虚拟环境如果没有额外“注册”给 Jupyter界面里自然看不到。所以核心思路就一句话让 Jupyter 知道“我这个虚拟环境存在并且可以作为一个内核来启动”。实现方式有几种最通用、最推荐的是在目标虚拟环境里安装ipykernel然后用它生成内核配置。后面我会给详细命令这里先记住原理。1.2 远程访问与开机自启的整体架构远程访问这事本质上是把 Jupyter 从一个“本地网页应用”变成一个“网络服务”。Jupyter Notebook / Lab 启动时会监听某个端口浏览器访问对应的 IP 加端口就能打开编辑器。你本机打开叫本地访问换成浏览器地址栏输入http://主机IP:端口就是远程访问。开机自启则更偏向系统服务层面的问题。Windows 下可以用“任务计划程序”在系统启动时触发一个脚本Linux 下更标准的方式是写一个 systemd service。两者共同的坑是Jupyter 通常是在某个 conda 虚拟环境下运行的自启脚本如果没把环境激活成功就会变成“找不到 jupyter 命令”或者“启动的是 base 环境里的旧版本服务”。所以整个方案的依赖关系是环境注册内核可见→ 服务配置远程可访问→ 自启管理开机免手动。这篇就按这个顺序来写。2. 核心细节解析与实操要点2.1 注册内核的标准操作流程先打开 Anaconda PromptWindows或终端Linux / macOS确认当前有哪些环境conda env list假设你有一个环境叫py311下面把它注册为 Jupyter 的一个内核。进入目标环境conda activate py311然后在环境内安装ipykernel。这一步很关键不是在 base 环境装而是在你要注册的那个环境里装conda install ipykernel安装完成后执行内核注册命令python -m ipykernel install --user --name py311 --display-name Python 3.11 (py311)说明一下参数的含义--name py311给这个内核起一个内部名字这个会成为 Jupyter 内核目录的文件夹名。--display-name Python 3.11 (py311)显示在 Jupyter 界面下拉列表里的名字你可以写得随便一点中文也行。--user把内核配置装到当前用户目录下不用管理员权限推荐加上。注册完不会有太多输出你可以用下面命令检查内核是否已经出现jupyter kernelspec list正常情况下你会看到类似这样的输出Available kernels: py311 C:\Users\你的用户名\AppData\Roaming\jupyter\kernels\py311 python3 C:\Users\你的用户名\anaconda3\share\jupyter\kernels\python3到这里重新打开 Jupyter Notebook 或 Jupyter Lab新建 Notebook 时下拉列表里就会出现“Python 3.11 (py311)”这个选项。新建后可以在单元格里执行这句来进一步验证import sys print(sys.executable)如果输出的路径指向anaconda3\envs\py311\python.exe说明内核注册成功代码跑在这个虚拟环境里。2.2 一个更省事的方案nb_conda_kernels除了手动注册还有一种思路是用nb_conda_kernels插件。这个插件运行在 base 环境里它会在 Jupyter 启动时自动扫描 conda 创建的所有环境并把它们全部列进内核列表不需要你逐个手动注册。安装方式很简单conda activate base conda install nb_conda_kernels装完之后只要你的某个虚拟环境里安装了ipykernelJupyter 打开时就会自动识别到它。不过我个人的建议是如果你只有一两个环境手动注册最直接、报错最少如果你环境特别多比如十几个再用nb_conda_kernels做自动发现。因为插件虽然方便偶尔会在环境非常庞杂时拖慢 Jupyter 的启动速度而且如果你删除了某个环境插件列表有时还会缓存旧的内核条目得手动清理。2.3 内核的删除与清理有时候环境名改了或者想清理掉已失效的内核可以用这条命令jupyter kernelspec uninstall py311注意这里删除的是内核配置不会动你的 conda 环境本身。还有一种常见情况你把 conda 环境删掉了但 Jupyter 内核列表里还残留着旧条目这时查看一下内核列表找出对应名称再 uninstall 掉即可。2.4 环境依赖差异带来的隐患注册内核之后很多人会忽略一个问题同一个.ipynb文件里如果代码块用到的库只在某个环境里装过换内核执行时照样会报ModuleNotFoundError。这是正常的因为内核本身就是独立解释器。所以在用 Jupyter 跑项目前先确认当前 Notebook 的右下角Lab 是左下角显示的内核名称是什么别稀里糊涂跑错环境否则排查半天还以为是代码问题。3. 远程访问配置详解3.1 生成带密码的配置文件远程访问前先做安全准备。Jupyter 默认在本地启动时会自动生成一个随机的 token浏览器访问时要输入 token 才能登录。做远程访问时直接用 token 也可以但每次打开地址都得复制粘贴很麻烦。更好的做法是配置一个固定密码。首先生成 Jupyter 配置文件jupyter notebook --generate-config如果你的 Jupyter 版本比较新它可能同时会生成jupyter_server_config.py或jupyter_notebook_config.py路径一般在用户目录下的.jupyter文件夹里。生成成功后执行jupyter server password按提示输入两次密码。这会在.jupyter下生成或更新jupyter_server_config.json里面保存的是密码的哈希值不会保存明文。这一步是必须做的安全上远比裸奔强。3.2 修改配置文件实现端口与 IP 绑定接着打开jupyter_notebook_config.py如果你主要用 Lab对应的配置项也一样找到或添加以下几行c.ServerApp.ip 0.0.0.0 c.ServerApp.port 8888 c.ServerApp.open_browser False c.ServerApp.allow_remote_access True c.ServerApp.token c.ServerApp.password argon2:xxx # 这个会自动存在json里通常不用手动改几个参数逐个说c.ServerApp.ip 0.0.0.0让服务监听所有网卡地址。这样局域网里的其他设备才能通过主机 IP 访问。如果只写127.0.0.1那就只能在主机本机访问。c.ServerApp.port 8888服务端口。如果 8888 被占用可以换8889、9999等。c.ServerApp.open_browser False防止服务器启动时尝试打开浏览器。远程场景和自启场景下一定要关掉。c.ServerApp.token 清掉随机 token让密码登录生效。有一点要特别提醒远程访问不等于必须把服务暴露到公网。如果你只是在局域网内用IP 绑0.0.0.0、防火墙放行端口就够了。如果你需要跨越公网访问最稳妥的方式是用 SSH 隧道转发端口而不是直接把 8888 端口暴露到公网否则很容易被扫描工具盯上变成恶意登录的靶子。注意如果是生产环境或服务器上有重要代码建议不要设置token 。保留 token 加上密码双因素更安全代价是访问时地址栏里要带?tokenxxx。根据使用场景取舍。3.3 Windows 防火墙放行端口配置文件改好了还差一道门要开防火墙。如果不放行端口局域网其他设备访问时会直接超时或拒绝连接。Windows 下可以图形界面操作也可以直接用命令。管理员权限打开 PowerShell 执行netsh advfirewall firewall add rule nameJupyter 8888 dirin actionallow protocolTCP localport8888这条命令会在入站规则里新增一条允许 TCP 8888 端口的规则。如果之后想删除规则netsh advfirewall firewall delete rule nameJupyter 8888如果是 Linux 服务器常见用的是firewalld或ufw# firewalld sudo firewall-cmd --permanent --add-port8888/tcp sudo firewall-cmd --reload # ufwUbuntu sudo ufw allow 8888/tcp这里多说一句Windows 下如果用的是 Anaconda 自带的“允许来自网络访问”弹窗在首次启动 Jupyter 时 Windows 安全中心也会弹询问点“允许”就行。有时候你已经点了允许但局域网还是访问不了大概率是防火墙规则只对“专用网络”生效而当前网络被系统识别为“公用网络”。可以检查防火墙配置文件里该规则的“配置文件”勾选范围或者直接允许“域/专用/公用”三种省得排查半天。3.4 启动与访问路径配置全部搞定后启动 Jupyterjupyter notebook启动日志里会显示类似[I ...] ServerApp is running at http://0.0.0.0:8888/这时候你在另一台电脑浏览器里访问http://你的主机IP:8888 http://你的主机IP:8888/lab第一条是打开 Notebook第二条是打开 Lab。如果你的浏览器和 Jupyter 不在同一个局域网而是通过路由端口映射或公网 IP 访问那地址就是http://你的公网IP:映射端口但我不推荐这种直接暴露方式后面会展开说。3.5 远程访问的常见安全建议我在实际服务器上配置过太多次 Notebook 远程访问见过太多人图省事直接用默认端口裸奔结果第二天发现被塞了一堆挖矿进程。几个必须做到的事项一定设置强密码不要用123456这种。公网访问优先走 SSH 隧道而不是开公网端口。如果必须直接暴露至少用防火墙限制来源 IP 白名单比如只允许公司出口 IP 访问。Jupyter 服务不要用 root 用户跑单独建一个普通用户权限更小风险更低。4. 开机自启的两种落地方式4.1 Windows用任务计划程序实现登录自启Windows 下做开机自启最稳定的是“任务计划程序”。先写一个批处理脚本比如放在D:\scripts\jupyter_start.batecho off cd /d D:\work call C:\Users\你的用户名\anaconda3\Scripts\activate.bat py311 jupyter notebook --configC:\Users\你的用户名\.jupyter\jupyter_notebook_config.py里头的关键点是call调用 Anaconda 的activate.bat。这一步是为了在批处理环境里激活指定 conda 环境然后再执行jupyter notebook。如果不call activate直接写jupyter命令往往只能找到 base 环境里的 Jupyter起不到“在指定环境下跑服务”的效果。然后按 WinR输入taskschd.msc打开任务计划程序右侧点“创建任务”。常规选项卡名称填Jupyter Notebook选择“不管用户是否登录都要运行”。触发器选项卡点“新建”开始任务选“启动时”或“登录时”。如果要真正做到开机不登录也运行选“启动时”如果只是日常个人电脑选“登录时”更省心因为桌面环境已经就绪日志也更容易排查。操作选项卡点“新建”“操作”选“启动程序”程序或脚本填批处理文件的完整路径D:\scripts\jupyter_start.bat。条件选项卡取消“只有在计算机使用交流电源时才启动此任务”这个勾选否则笔记本插电状态可能会受影响。设置选项卡勾选“如果任务失败重新启动”间隔设 1 分钟最多重启 3 次。保存后可以手动右键“运行”测试一下浏览器里能打开页面说明任务配置成功。4.2 Linux用 systemd 服务实现系统自启Linux 下更标准的方式是 systemd。假设用户是ubuntuconda 装在/home/ubuntu/anaconda3虚拟环境为py311那先创建服务文件sudo vim /etc/systemd/system/jupyter.service内容如下[Unit] DescriptionJupyter Notebook Server Afternetwork.target [Service] Typesimple Userubuntu WorkingDirectory/home/ubuntu/work EnvironmentPATH/home/ubuntu/anaconda3/envs/py311/bin:/home/ubuntu/anaconda3/bin:/usr/local/sbin:/usr/bin:/bin ExecStart/home/ubuntu/anaconda3/envs/py311/bin/jupyter notebook --config/home/ubuntu/.jupyter/jupyter_notebook_config.py Restartalways RestartSec5 [Install] WantedBymulti-user.target这里有个容易被忽略的细节ExecStart直接写虚拟环境里jupyter的绝对路径比先 source activate 再执行更可靠。因为 systemd 的登录 shell 环境和普通终端不太一样conda activate经常写不对直接指定绝对路径最简单粗暴也最稳。Environment里的 PATH 要包含虚拟环境的bin目录否则 Jupyter 启动时可能找不到同一个环境里的其他可执行程序。然后执行sudo systemctl daemon-reload sudo systemctl enable jupyter.service sudo systemctl start jupyter.service查看状态sudo systemctl status jupyter.service如果看到active (running)说明自启服务已经跑起来了。想看日志的话journalctl -u jupyter.service -f4.3 自启场景下常见的坑自启失败的大多数原因我根据经验归纳成三类路径问题bat 脚本或 ExecStart 里写错了 conda 路径。不要用相对路径全部写成绝对路径。环境未激活Windows 下没有call activate.bat导致 Jupyter 在 base 环境启动或者干脆找不到命令。Linux 下就是 PATH 和 ExecStart 没指向虚拟环境。端口冲突之前手动启动过 Jupyter 占着 8888 端口服务自启时端口已经被占用进程启动失败。解决方法是启动前检查端口或者把配置文件里的端口改掉。排查时可以用netstat -ano | findstr 8888Windows或ss -lntp | grep 8888Linux看是否有进程占用。自启服务跑起来之后还需要确认一个细节WorkingDirectory设的路径会决定 Jupyter 打开时的默认目录建议设成你的工作目录而不是根目录这样每次打开就是熟悉的项目文件夹省得来回切换。5. 常见问题与排查技巧实录5.1 内核列表里看不到新注册的环境执行完python -m ipykernel install后Jupyter 里怎么也不显示新内核。这种情况优先排查内核安装目标路径。正常来说--user会把配置写到当前用户的jupyter/kernels目录下。如果你在虚拟环境里执行命令时没带--user它可能会写进 Anaconda 的系统目录而 Jupyter 默认搜索路径不包含那里自然就看不到。这时用jupyter kernelspec list看看输出如果新内核出现在某个.../envs/py311/share/jupyter/kernels下而 Jupyter 启动时没有扫描到这个位置可以手动把内核目录复制到用户目录下或者干脆卸载重新用--user注册一次。另一个原因是你正在使用的 Jupyter 版本和安装ipykernel的环境属于不同主版本比如 base 是 Python 3.9环境是 Python 3.11一般没问题但如果新旧差异太大内核注册时 kernel.json 里的 Python 路径写不对也会失效。最直接的检查方式是用文本编辑器打开内核目录下的kernel.json看里面的argv里的 python 路径是否真实存在。5.2 远程访问打不开、403 或 404远程访问出问题先从这几处查起服务是否真的在监听0.0.0.0而不是127.0.0.1。启动日志里看ServerApp is running at的地址如果还是127.0.0.1说明配置没生效检查配置文件是不是被旧版本配置覆盖了。防火墙是否放行对应端口。可以在主机外的设备上执行telnet 主机IP 8888看端口通不通不通就先处理防火墙。打开页面出现403一般是 Host 头校验问题。新版 Jupyter 默认有ServerApp.allow_remote_access校验确认已经设置为True有时还需要加上c.ServerApp.allow_origin * c.ServerApp.allow_origin_pat .*打开页面出现404往往是因为地址里漏了/tree或/lab路径或者访问的是根路径但 Jupyter 没有配置根目录内容列表。用http://主机IP:8888/tree或http://主机IP:8888/lab试探一下。5.3 Jupyter Notebook 打不开单元格执行没有反应这类问题比较集中说两个典型。第一个是“页面能打开但启动内核时一直转圈或者执行单元格无反应”。多半是内核进程崩溃了。可以在启动 Jupyter 的终端里看报错如果是 Windows 下出现类似ImportError: DLL load failed while importing rpds这通常是 conda 环境中某些库的 DLL 依赖冲突。常见于rpds-py、zstandard这类需要编译的包。解决办法是先升级相关包pip install --upgrade rpds-py还不行就把该环境里的rpds-py卸载重装或者用 conda 重装一遍conda install --force-reinstall rpds-py第二个是“浏览器打开 Jupyter 白屏或一直转”。先排除插件冲突和缓存换个无痕窗口试试。如果换了浏览器就正常说明是原来的浏览器扩展尤其是广告拦截、代理类插件拦了 WebSocket 连接。Jupyter 前端和内核通信依赖 WebSocket拦截类插件经常导致页面能打开但无法执行代码。5.4 Anaconda 环境变量混乱导致的找不到命令远程访问场景里还有一个高频坑手动配置过 Anaconda 环境变量但 PATH 顺序乱了导致终端里敲jupyter用的是系统自带的 Python而不是 Anaconda 的。检查方法是在终端执行where jupyterWindows 下会列出所有能找到的jupyter.exe正常情况下第一个应该是 Anaconda 目录下的。如果第一个是C:\Windows\System32或第三方 Python说明 PATH 顺序不对。把 Anaconda 相关路径往前放或者干脆卸载重装时勾选“Add to PATH”省得后续各种奇怪问题。5.5 端口被占用时如何换端口启动 Jupyter 时如果提示端口被占用最直接的解决办法是启动时加参数jupyter notebook --port 8890但如果你在配置文件里写死了c.ServerApp.port 8888命令行参数会被命令行覆盖吗实际上命令行参数优先级高于配置文件可以这么临时测试。不过自启场景下推荐修改配置文件里的端口保持一致。改完记得同时更新防火墙规则把新端口也放行。6. 实操总结与避坑心得整套流程走到这里核心链路已经通了虚拟环境注册成内核 → Notebook / Lab 可以自由选择解释器 → 修改配置让服务监听所有网卡 → 防火墙放行端口 → 远程浏览器访问 → 任务计划或 systemd 实现开机自启。每一步单独看都不难难的是把这几件事串起来并且知道什么时候该去哪里排查。我在实际运维里踩过不少坑最大的几条经验是注册内核这事能早做就早做。刚创建完 conda 环境就顺手conda install ipykernel并python -m ipykernel install比等环境里装了一百个包、跟 Jupyter 死活对不上版本之后再补救省心得多。配置远程访问时密码和安全策略必须在服务暴露之前设置好否则服务一启动就处于裸奔状态。真被扫描器盯上清进程、查后门的时间够你配置十遍。自启脚本里一定要写绝对路径。不管 Windows 的 bat 还是 Linux 的 systemd unit但凡用了相对路径或依赖某个“默认 PATH”等你重启完机器面对一个起不来的服务时就知道什么叫追悔莫及。最后再分享一个我个人的小习惯在每一个用到 Jupyter 的 conda 环境根目录下放一个environment.yml记录这个环境完整的包依赖。这样即使哪天真把环境搞崩了也能一条conda env create -f environment.yml快速重建不至于连 Jupyter 内核都跟着一块儿陪葬。这些操作积累下来的经验比工具本身更有价值用到的时候你会感谢自己当初多花的那几分钟。
返回列表