当前位置: 首页 > news >正文

macOS Apple Silicon下Anaconda安装避坑指南:架构、校验与环境隔离

1. 为什么今天在 macOS 上装 Anaconda 不再是“点一下就完事”了?

你可能还记得五年前,双击那个.pkg文件,一路点“继续”,等进度条走完,打开终端敲conda --version,回车——绿色的版本号跳出来,心里踏实得像刚泡好一杯手冲咖啡。但现在,尤其是当你手里那台 M3 Pro 的 MacBook Pro 亮起屏幕,准备开始新项目时,事情没那么简单了。我亲手在 12 台不同配置的 Mac 上重装过 Anaconda:M1 Air、M2 Ultra、Intel i9 iMac、甚至还在一台被遗忘在实验室角落的 2015 年款 Retina MacBook Pro 上试过——结果有 7 台在第一步就卡住了。“conda: command not found” 这行红字,已经不是报错,而是某种当代数据工作者的成人礼。

问题不在 Anaconda 本身变坏了,而在于整个底层生态在剧烈位移。Apple Silicon 的 ARM64 架构不是 Intel x86_64 的简单复刻,它是另一套指令集、另一套内存模型、另一套 ABI(应用二进制接口)。当你误装一个为 Intel 编译的包,macOS 就会自动调用 Rosetta 2 翻译层——这就像让一个中文母语者实时口译德语会议,能听懂,但反应慢、耗电高、偶尔还漏掉关键细节。我实测过,在 M2 Mac 上运行 Intel 版 Anaconda 的jupyter lab启动时间比原生 ARM64 版慢 3.8 倍,内存占用高出 62%,而且numpy的向量化运算性能直接打七折。这不是玄学,是芯片级的物理事实。

更隐蔽的坑藏在 shell 初始化里。macOS 自 10.15 Catalina 起就把默认 shell 从bash悄悄换成了zsh,而很多老教程还在教你怎么改~/.bash_profile。你装完 Anaconda,conda init bash也跑了,可终端里敲conda还是报错——因为你压根没在zsh里初始化。这就像给一辆 Tesla Model Y 装了汽油发动机的说明书,方向没错,但执行对象完全错了。还有 PATH 环境变量的污染问题:你可能三年前装过 Miniconda,两年前又试过 Homebrew Python,上个月还手动编译过一个 PyPy,这些路径全堆在~/.zshrc里,像一串缠死的耳机线。which python3返回的可能是/usr/local/bin/python3,也可能是/opt/homebrew/bin/python3,唯独不是你刚装的/Users/yourname/anaconda3/bin/python3。这种混乱不会立刻让你崩溃,但它会在你深夜调试一个pandas内存泄漏问题时,突然让你怀疑人生——因为你在 debug 的根本不是你认为的那个 Python 解释器。

所以这篇指南不讲“怎么装”,而是讲“怎么装对”。它基于我在 2024–2025 年间为 37 个真实科研团队和初创公司搭建 Python 开发环境的经验总结。我们不追求最短路径,而追求最稳路径;不迷信一键脚本,而信任可验证的每一步。你会看到 checksum 校验为什么不是形式主义,conda init后必须重启 Terminal 的底层机制是什么,以及为什么我建议你永远把 Anaconda 装在~/anaconda3而不是/opt/anaconda3。这不是教科书,这是我在凌晨两点修好第 19 台 Mac 后,写给下一个踩坑者的备忘录。

2. 安装前的三道硬门槛:架构确认、下载验证、路径决策

2.1 第一道门:用两条命令,10 秒内锁定你的 Mac 真实身份

别信系统偏好设置里的“芯片”字样,也别靠型号年份猜。苹果的硬件命名游戏太复杂,M1 Pro 和 M1 Max 都叫“Apple M1”,但它们的内存带宽差了一倍。我们要看的是操作系统正在运行的指令集,这才是软件兼容性的唯一判据。打开终端,输入:

uname -m

这个命令返回的是内核报告的机器类型。如果输出是arm64,恭喜,你拥有一台 Apple Silicon Mac(M 系列芯片),必须使用.osx-arm64后缀的安装包。如果输出是x86_64,那你是一台 Intel Mac,理论上该用.osx-64包。但注意,这里有个关键转折点:截至 2025 年 6 月,Anaconda 官方已停止为 Intel Mac 发布新版本安装包。他们最新的2025.06版本只提供osx-arm64构建。这意味着,如果你的uname -m返回x86_64,你有两个严肃选择:第一,接受现实,转向 Miniforge(它持续维护 Intel 构建);第二,去 Anaconda 官网的 Archived Installers 页面,手动下载2024.10或更早的osx-64包。我强烈建议选第一个,因为旧版 Anaconda 的conda解析器在处理现代pyproject.toml依赖时,会出现静默失败。

但光看uname -m还不够保险。我见过最离谱的案例,是一位用户在 M1 Mac 上,uname -m显示arm64,可他装完 Intel 版 Anaconda 后,python3 -c "import platform; print(platform.machine())"却输出x86_64。原因?他在安装时勾选了“Open using Rosetta”选项。Rosetta 是 macOS 的翻译层,它能让 Intel 应用在 Apple Silicon 上跑,但它会欺骗 Python,让它以为自己运行在 x86_64 环境里。所以第二条命令必须跟上:

python3 -c "import platform; print(platform.machine())"

这条命令问的是 Python 解释器自己“感觉”自己在哪种 CPU 上跑。两个命令的输出必须严格一致,才是健康状态。如果uname -marm64platform.machine()x86_64,说明你中了 Rosetta 的招,必须卸载重装 ARM64 版,并确保安装器和终端 App 都没有被标记为“使用 Rosetta 打开”。

2.2 第二道门:校验 checksum,不是仪式,是防篡改的最后防线

你从官网下载的.pkg.sh文件,本质上是一个未经加密的二进制包。它在传输过程中可能被网络设备缓存污染,也可能被恶意镜像站替换。Anaconda 官方为每个发布版本都提供了 SHA256 校验和,它就像一个数字指纹——哪怕文件里只有一个比特翻转,指纹就会彻底改变。跳过这步,等于把你的开发环境钥匙,亲手交到不可信的中间人手上。

校验方法极其简单,但必须精确。假设你下载的文件是Anaconda3-2025.06-0-MacOSX-arm64.pkg,它应该位于~/Downloads/目录下。在终端中执行:

shasum -a 256 ~/Downloads/Anaconda3-2025.06-0-MacOSX-arm64.pkg

命令会输出一长串字符,例如a1b2c3d4e5f6... /Users/yourname/Downloads/Anaconda3-2025.06-0-MacOSX-arm64.pkg。现在,去 Anaconda 官网的下载页面,找到对应版本的 “SHA256 Checksum” 字段,把它复制下来,和你终端输出的前 64 个字符(即空格前的部分)逐位比对。必须完全一致,一个字符都不能差。我曾遇到一次,用户下载的包校验和后三位和官网不符,他以为是复制错了,反复试了五次。最后发现,是公司防火墙的 SSL 拦截功能,在下载过程中悄悄修改了文件头。这种问题,只有 checksum 能揪出来。

如果校验失败,不要尝试“再下一次”。先清除 macOS 的隔离属性(quarantine attribute),这是系统为安全加的一道锁,有时会干扰校验:

xattr -dr com.apple.quarantine ~/Downloads/Anaconda3-2025.06-0-MacOSX-arm64.pkg

然后重新运行shasum。如果还是失败,唯一的正确操作是:删除文件,清空浏览器缓存,用 Safari 直接访问官网下载,不要通过任何第三方链接或镜像。安全没有捷径,这 30 秒的等待,能省下你未来三天的排查时间。

2.3 第三道门:安装路径的选择,是一场关于权限与维护的哲学思辨

安装器会问你:“安装到哪里?” 选项通常是两个:/Users/yourname/anaconda3(默认)和/opt/anaconda3(需要管理员密码)。表面上看,后者听起来更“专业”,更像 Linux 系统的风格。但在我经手的全部案例中,我无一例外地推荐选择用户目录(~/anaconda3。理由很实在,不是教条。

首先,权限问题。/opt是系统级目录,写入它需要sudo权限。这意味着,每次你想用conda update升级包,或者用conda install装新库,终端都会弹出密码框。这不仅打断工作流,更埋下安全隐患——一个恶意脚本只要能执行conda命令,就能获得你的管理员密码。而装在~/anaconda3下,所有操作都在你的用户空间内,干净、可控、无风险。

其次,多用户场景。如果你的 Mac 是共享机器(比如实验室公用机),/opt/anaconda3看似方便所有人用。但现实是,不同用户可能需要不同版本的numpytensorflow/opt下的安装是全局的,无法隔离。而每个用户装自己的~/anaconda3,再配合conda env create,就能完美实现环境沙箱。我帮一个生物信息学实验室部署时,就是让 8 位研究员各自安装,然后用conda env export > environment.yml共享环境定义,比全局安装可靠十倍。

最后,卸载与迁移。rm -rf ~/anaconda3是一条安全、原子、可逆的命令。而sudo rm -rf /opt/anaconda3则像在雷区跳舞——万一你手抖多按了一个空格,/opt下其他重要软件(比如 Homebrew 的某些核心)可能就没了。更重要的是,当你需要把开发环境迁移到新 Mac 时,~/anaconda3可以直接用 Time Machine 备份恢复,或者用rsync同步,而/opt/anaconda3的权限结构会给你制造无数麻烦。所以,别被“系统级”的虚名迷惑,用户目录才是现代 macOS 上最务实、最安全、最可持续的选择。

3. 图形化与命令行安装:两种路径,同一套验证逻辑

3.1 图形化安装(.pkg):快,但快得有章法

图形化安装是为绝大多数人设计的,它的优势在于直观、无感、适合新手。但“无感”不等于“无脑”。我见过太多用户双击.pkg后,一路狂点“继续”,在最后一步看到“Run conda init”复选框时,习惯性地取消勾选——因为他们觉得“init”听起来很技术,怕搞砸。结果就是,安装完成了,conda命令却找不到。所以,图形化安装的关键,在于对每一个交互点的理解和确认

第一步,双击下载好的.pkg文件。安装器启动后,会显示欢迎页,点击“继续”。接着是许可协议,滚动到底部,点击“继续”。这时会弹出一个关键窗口:“安装位置”。这里,请务必选择“Change Install Location…”按钮,然后导航到你的用户主目录(/Users/yourname),并手动输入anaconda3作为子文件夹名。不要用默认的/Users/yourname/anaconda3,因为安装器有时会偷偷加上斜杠,导致路径错误。手动输入,确保绝对精准。

第二步,进入“安装类型”页。这里通常只有一个选项:“Install for me only”。保持默认,点击“继续”。接下来是最重要的一步:“安装前检查”。安装器会扫描你的系统,检查磁盘空间、权限等。如果一切正常,它会进入“安装”页。此时,进度条开始走。在进度条走到约 80% 时,安装器会弹出一个对话框,标题是“Initialize Anaconda3”。这个对话框里有一句小字:“This will modify your shell profile to initialize conda.” 下面是一个复选框:“Run conda init”。请务必勾选它,并确保下面的 Shell 类型显示为zsh(这是 macOS 默认)。如果显示的是bash,说明你的系统被手动改过,你需要先修复 shell 设置。勾选后,点击“Continue”。

第三步,安装完成。安装器会显示“Installation was successful!”。此时,不要点击“Close”,而是先点击左下角的“Show Details”。你会看到一个日志窗口,里面记录了conda init的具体操作:它往~/.zshrc里添加了哪些行,是否成功重写了文件。快速扫一眼,确认没有Permission deniedNo such file or directory错误。确认无误后,点击“Close”,然后立刻关闭所有已打开的 Terminal 窗口。这不是建议,是强制要求。因为conda init修改的是~/.zshrc,而 Terminal 在启动时才读取这个文件。不重启,修改就永远不会生效。

3.2 命令行安装(.sh):掌控一切,适合自动化与审计

命令行安装.sh脚本,是给那些需要将环境部署过程写进 CI/CD 流水线、或者需要在无图形界面的服务器上部署的用户的。它牺牲了一点点易用性,换来了 100% 的可编程性和可审计性。整个过程,你可以用一个 shell 脚本封装,一键执行,且每一步都有明确的退出码,便于监控。

首先,确保你已校验过.sh文件的 checksum,方法和.pkg完全一样。然后,进入下载目录:

cd ~/Downloads

执行安装脚本。注意,.sh脚本必须用bash执行,即使你的默认 shell 是zsh

bash Anaconda3-2025.06-0-MacOSX-arm64.sh

脚本启动后,会显示欢迎信息和许可协议。按空格键翻页,看到 “Do you accept the license terms? [yes|no]” 时,输入yes并回车。接着,它会问 “Anaconda3 will be installed into this location: /Users/yourname/anaconda3. Press ENTER to confirm the location…”。这里,不要直接按回车!因为默认路径是~/anaconda3,但我们需要确保它绝对正确。所以,按回车后,它会再次确认路径,此时你可以输入~/anaconda3(或/opt/anaconda3,如果你坚持用系统目录),然后回车。

最关键的一步来了。脚本会问:“Do you wish the installer to initialize Anaconda3 by running conda init? [yes|no]”。必须输入yes。然后,它会问:“Would you like to initialize conda in your zsh shell?”。输入yes。此时,脚本会自动修改~/.zshrc,并在末尾添加初始化代码块。它还会提示你:“To finish the installation, please close and reopen your terminal or run: source ~/.zshrc”。请务必执行source ~/.zshrc,而不是重启 Terminal。因为在自动化脚本中,重启 Terminal 是不可控的,而source命令可以立即加载新配置,保证后续命令能识别conda

命令行安装的优势在于,它的每一步都是明文、可记录、可回溯的。你可以把整个安装过程重定向到一个日志文件:

bash Anaconda3-2025.06-0-MacOSX-arm64.sh &> install_log.txt

日后如果出问题,install_log.txt就是你最可靠的线索。它会清晰地告诉你,conda init是否成功执行,~/.zshrc是否被正确写入,以及是否有任何权限警告。这种透明度,是图形化安装永远无法提供的。

4. 初始化、验证与环境管理:让 conda 真正活起来

4.1 conda init 的本质:它到底在你的 shell 里干了什么?

conda init这个命令,常被误解为一个神秘的黑盒。其实,它做的是一件非常具体、非常透明的事:它向你的 shell 配置文件(如~/.zshrc)里,追加一段用于激活 conda 环境的 shell 函数和别名。理解了这一点,你就掌握了所有问题的钥匙。

当你运行conda init zsh后,打开~/.zshrc文件(用nano ~/.zshrccode ~/.zshrc),你会在文件末尾看到类似这样的代码块:

# >>> conda initialize >>> # ... (注释说明) # >>> conda initialize >>> # >>> conda initialize >>> # ... (注释说明) # <<< conda initialize <<< # >>> conda initialize >>> # ... (注释说明) # <<< conda initialize <<<

这段代码的核心,是定义了一个名为conda的 shell 函数。它不是一个简单的可执行文件路径,而是一个智能的调度器。当你在终端输入conda list时,这个函数会被触发,它会:

  1. 检查当前是否已激活某个 conda 环境;
  2. 如果没有,它会自动加载 base 环境的配置;
  3. 然后,它会把真正的conda可执行文件(位于~/anaconda3/bin/conda)的路径,临时加入到当前 shell 的PATH环境变量最前面;
  4. 最后,它才执行~/anaconda3/bin/conda list

这就是为什么which conda会返回~/anaconda3/bin/conda,而不是/usr/bin/condaconda init的魔法,就在于它动态地、按需地劫持了PATH查找顺序。它不修改系统 Python,也不动/usr/bin,只是在你的用户 shell 里,悄悄地、优雅地插入了一层代理。

所以,当conda: command not found时,90% 的情况,不是 conda 没装好,而是conda init没生效,或者生效了但你没重启 Terminal。验证方法很简单:打开一个新的 Terminal 窗口,输入cat ~/.zshrc | tail -n 20,看看最后 20 行里有没有>>> conda initialize >>>这段标记。如果没有,说明conda init根本没运行;如果有,但which conda还是报错,那就说明 Terminal 没有重新加载~/.zshrc,必须重启。

4.2 验证安装:四步黄金测试法,拒绝侥幸心理

安装和初始化完成后,不能只满足于conda --version能跑。那只是“能说话”,不是“能干活”。我设计了一套四步验证法,每一步都直指一个常见故障点,确保你的环境是真正健康的。

第一步:基础命令通路测试

which conda

预期输出:/Users/yourname/anaconda3/bin/conda(路径必须精确匹配你的安装位置)。如果输出为空或指向其他地方,说明conda init失败或未生效。

第二步:Python 解释器绑定测试

which python3 python3 -c "import sys; print(sys.executable)"

这两个命令的输出必须完全一致,且都指向~/anaconda3/bin/python3。如果which python3指向/usr/bin/python3,说明你的PATH里,系统 Python 的路径排在了 conda Python 前面,你需要检查~/.zshrcexport PATH=...的顺序,确保 conda 的bin目录在最前面。

第三步:核心包可用性测试

conda list | head -n 10

这个命令会列出已安装的前 10 个包。你应该能看到anaconda,python,numpy,pandas,scipy等核心包的名字和版本号。如果列表为空,或者只有寥寥几个包,说明安装过程可能被中断,或者.pkg文件损坏。

第四步:Jupyter 启动能力测试

jupyter lab --version

这个命令不启动 GUI,只检查 JupyterLab 的可执行文件是否存在及其版本。如果报错command not found,说明jupyterlab包没有被默认安装(虽然它应该有)。此时,运行conda install jupyterlab -y即可。切记,不要用pip install jupyterlab,因为 pip 安装的 Jupyter 可能和 conda 的 Python 环境不兼容,导致后续的 kernel 启动失败。

这四步测试,每一步都像一道安检门。只有全部通过,你才能放心地把项目代码放进去。我坚持这个流程,是因为它帮我提前发现了 17 次潜在的环境冲突,避免了那些“代码在别人电脑上能跑,到我这就报错”的经典尴尬。

4.3 环境管理:为什么 base 环境是“毒药”,以及如何构建你的项目堡垒

base环境,是 conda 安装后自动创建的默认环境。它很诱人,因为它“开箱即用”,里面有所有你可能需要的包。但在我过去三年的咨询经验中,我建议所有用户,从第一天起,就彻底放弃base环境。原因有三:

第一,污染风险极高base是所有环境的父环境。一旦你在baseconda install了一个新包,它就会成为所有新创建环境的默认依赖。想象一下,你为一个机器学习项目装了tensorflow 2.15,结果一个月后,你为一个数据分析项目创建新环境,conda create -n>conda create -n my-project-env python=3.11 -y

-n指定环境名,python=3.11锁定了 Python 版本,-y自动确认。创建完成后,必须先激活它,再做任何事

conda activate my-project-env

此时,你的终端提示符前会加上(my-project-env),这是 conda 给你的视觉确认。现在,所有conda installpip install的操作,都只会影响这个环境,与其他环境完全隔离。安装完所需包后,导出环境定义:

conda env export > environment.yml

这个environment.yml文件,就是你项目的“DNA”。它精确记录了 Python 版本、所有包的名称和版本号,甚至包括构建号(build number)。你的同事只需执行conda env create -f environment.yml,就能在自己的机器上,100% 复现出和你一模一样的环境。这才是专业数据工作的起点。

5. 常见问题深度排查与独家避坑指南

5.1 “conda: command not found” 的七种死因与解剖式修复

这个报错,是 macOS 上 Anaconda 用户的头号噩梦。它看似简单,但背后的原因千差万别。我根据真实支持日志,将其归类为七种典型死因,并给出针对性的、可执行的修复方案。

死因一:conda init根本没运行

  • 症状cat ~/.zshrc | grep "conda initialize"返回空。
  • 诊断:安装时取消了“Run conda init”复选框,或命令行安装时输入了no
  • 修复:手动运行conda init zsh,然后必须关闭并重新打开所有 Terminal 窗口。不要source ~/.zshrc,因为conda init会向~/.zshrc添加新内容,source只能加载已有内容,无法加载新添加的函数定义。

死因二:Terminal 没有重新加载配置

  • 症状cat ~/.zshrc | grep "conda initialize"有输出,但which conda仍为空。
  • 诊断conda init成功了,但你没重启 Terminal,或者你打开了一个旧的、已启动的 Terminal 窗口。
  • 修复:关闭所有 Terminal 窗口,从 Dock 或 Launchpad 重新启动一个全新的 Terminal。不要用Cmd+T新建标签页,因为新标签页会继承旧进程的环境变量。

死因三:Shell 类型错误

  • 症状echo $SHELL输出/bin/bash,但conda init zsh被运行了。
  • 诊断:你的系统默认 shell 是 bash,但你错误地初始化了 zsh。
  • 修复:先运行conda init bash,然后重启 Terminal。或者,更推荐的做法,是把你的默认 shell 切换到 zsh:chsh -s /bin/zsh,然后运行conda init zsh

死因四:PATH 被其他配置覆盖

  • 症状cat ~/.zshrc | grep "conda initialize"有输出,which conda也指向正确路径,但conda --version报错。
  • 诊断~/.zshrc里有其他export PATH=...的语句,把 conda 的bin目录从PATH开头挤到了后面。
  • 修复:用nano ~/.zshrc打开文件,找到所有export PATH=的行。确保conda initialize的代码块(即>>> conda initialize >>>那段)位于所有export PATH=语句的最下方。保存后,重启 Terminal。

死因五:Quarantine 属性干扰

  • 症状:在 macOS 14 Sonoma 及更高版本上,首次运行conda时,系统弹出“无法打开,因为来自身份不明的开发者”的警告。
  • 诊断:macOS 的 Gatekeeper 安全机制给.pkg安装器打了隔离标签。
  • 修复:在终端中执行xattr -dr com.apple.quarantine ~/anaconda3,然后重启 Terminal。

死因六:多个 Anaconda 安装共存

  • 症状which conda返回/opt/anaconda3/bin/conda,但你想用的是~/anaconda3
  • 诊断:你之前装过系统级的 Anaconda,/opt/anaconda3的路径被写进了~/.zshrc
  • 修复nano ~/.zshrc,搜索anaconda3,删除所有指向/opt/anaconda3export PATH行,只保留~/anaconda3的。保存后,重启 Terminal。

死因七:Conda 自身损坏

  • 症状:以上所有步骤都确认无误,which conda正确,但conda --versionImportError: No module named 'conda'
  • 诊断~/anaconda3/lib/python3.11/site-packages/目录下,conda包的文件可能损坏或缺失。
  • 修复:这是最极端的情况。运行~/anaconda3/bin/conda update conda -y。如果失败,则只能卸载重装。

5.2 Jupyter 启动失败:从端口冲突到 kernel 丢失的全链路诊断

Jupyter Lab 或 Notebook 启动失败,是另一个高频痛点。它不像conda报错那么直白,常常表现为浏览器打不开、页面空白、或者控制台里一堆红色 traceback。我梳理了一条从表象到根源的诊断链。

现象一:浏览器打不开,控制台显示OSError: [Errno 48] Address already in use

  • 根源:端口被占用。Jupyter 默认用 8888 端口,但这个端口可能被 Docker、另一个 Jupyter 实例,甚至某个 Node.js 服务占用了。
  • 诊断lsof -i :8888。这会列出占用 8888 端口的进程 PID。
  • 修复kill -9 <PID>杀掉它。或者,启动时指定新端口:jupyter lab --port=8889

现象二:浏览器打开,但页面显示Kernel starting, please wait...,然后一直转圈

  • 根源:Jupyter Kernel 没有正确连接到你的 conda 环境。
  • 诊断:在 Terminal 中,运行jupyter kernelspec list。你应该看到一个名为python3的 kernel,其路径指向~/anaconda3/share/jupyter/kernels/python3。如果看不到,或者路径指向/usr/local/share/...,说明 kernel 没注册。
  • 修复:先确保你已激活目标环境:conda activate my-project-env。然后运行python -m ipykernel install --user --name my-project-env --display-name "Python (my-project-env)"。这会把当前环境注册为一个名为my-project-env的 kernel。重启 Jupyter,就能在右上角的 kernel 选择器里看到它。

现象三:Jupyter 启动成功,但 import 一个包时报ModuleNotFoundError

  • 根源:你在 Jupyter 里运行的 Python 解释器,和你conda activate的环境不一致。
  • 诊断:在 Jupyter 的 notebook 单元格里,运行import sys; print(sys.executable)。输出的路径,必须和你在 Terminal 中which python3的输出完全一致。
  • 修复:这说明你选择了错误的 kernel。点击 Jupyter 右上角的 kernel 名称(如Python 3),在下拉菜单中,选择你刚刚注册的Python (my-project-env)。然后重启 kernel(Kernel -> Restart Kernel)。

现象四:Jupyter Lab 启动后,左侧文件浏览器里看不到你的项目文件夹

  • 根源:Jupyter Lab 的工作目录(working directory)不是你期望的位置。
  • 诊断:Jupyter Lab 默认在你启动它的那个 Terminal 的当前目录下启动。
  • 修复:启动前,先cd到你的项目文件夹,再运行jupyter lab。或者,用jupyter lab --notebook-dir=/path/to/your/project指定工作目录。

5.3 许可与替代方案:当 Anaconda 不再是唯一选择

2025 年的许可条款更新,是一个分水岭。Anaconda Individual Edition 的免费范围,现在明确限定在“200 人以下的组织”。这意味着,如果你是一家拥有 205 名员工的 SaaS 初创公司,或者一个大型高校的院系,继续免费使用 Anaconda,就存在合规风险。这不是危言耸听,Anaconda 公司的法务团队,已经在 2024 年底开始对部分企业用户发送合规问询函。

面对这个现实,有三个成熟、稳定、且完全开源的替代方案,它们都由社区驱动,没有商业许可限制:

Miniconda:这是最轻量的“纯净版”conda。它只包含 Python 解释器和conda包管理器本身,体积不到 400MB。所有科学计算包,都需要你手动conda install。它的优势在于极简、可控、启动快。对于只需要核心工具链(如conda,pip,git)的 DevOps 工程师或 CI/CD 流水线,Miniconda 是首选。安装方式和 Anaconda 完全相同,只是下载的.pkg文件名是Miniconda3-latest-MacOSX-arm64.pkg

Miniforge:这是 Miniconda 的一个“社区增强版”。它最大的不同,在于它的默认通道(channel)是conda-forge,而不是 Anaconda 官方的defaultsconda-forge是一个完全由志愿者维护的、开放的包仓库,它更新更快、包更多、且没有任何商业许可审查。例如,pytorch的最新 nightly 版本,往往在conda-forge上比defaults早一周发布。Miniforge 的安装包,可以在 GitHub 的 [conda-forge/miniforge](https://github.com

http://www.jsqmd.com/news/1134356/

相关文章:

  • OpenShift企业级云原生操作系统:Operator驱动的混合云治理实践
  • KeymouseGo:告别重复劳动,让鼠标键盘自动化成为你的数字助手
  • 打卡信奥刷题(3430)用C++实现信奥题 P10236 [yLCPC2024] D. 排卡
  • Excel数据透视表条件格式两大实战方案
  • 你的老旧电视也能流畅看直播:15MB轻量级电视直播应用全解析
  • C++笔记之std::list和std::vector的区别
  • Kafka 消费幂等:重复消息不可怕,重复副作用才可怕
  • PloneFormGen邮件适配器配置:性能优化与安全实践指南
  • Plone零代码交互:用Web Components封装JS行为
  • Python用户组实战:Grinder分布式压测与本地技术社区价值
  • 第二十一届智能车竞赛硬件盲盒任务参赛介绍
  • AI认知革命:从推箱子任务看世界模型与规划算法的技术演进
  • MAX22000与MSP432P401R高精度信号采集系统设计
  • OpenShift企业级落地:混合云编排与安全策略即代码实战
  • Django 集成 Okta 的最佳实践:从 OIDC 协议到生产级部署
  • AI Agent 部署与配置实战:从 Hermes 安装到跨平台自动化
  • Shell脚本工程化:从能跑到稳跑的7大核心原则
  • STM32F373RC与SLO2016高精度隔离数据采集方案
  • 前后端分离医院信管系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • STM32与XTR116实现4-20mA工业信号传输设计
  • SQLite + R 数据分析实战:轻量数据库如何解决内存、维护与协作三大痛点
  • pyenv实战指南:Python多版本管理与环境一致性工程实践
  • Wagtail编辑友好型CMS设计:用结构化思维实现真正灵活的内容管理
  • PIC32MZ与WS2812智能灯光控制系统开发指南
  • 一条命令将Markdown转PDF:WeasyPrint印刷级排版实战
  • PostgreSQL部分表迁移实战:DMS vs MWAA+dblink选型对比
  • AWS容器化实战:ECS、EKS与Fargate生产级选型与调优
  • 医疗营销五大核心挑战:合规、信任、旅程、数据与归因的实战拆解
  • Few-shot 例子到底怎么挑
  • Plone Diazo变量机制原理与实战避坑指南