news 2026/9/29 1:09:18

Ubuntu安装Anaconda全攻略:隔离环境、镜像加速与避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ubuntu安装Anaconda全攻略:隔离环境、镜像加速与避坑指南

我到现在还记得第一次在 Ubuntu 上把系统自带的 Python 折腾崩掉的那个下午。起因特别简单,就是一个项目需要装某个包,我只记得用pip装了个新版本依赖,结果 apt 下面的软件好几个打不开,最后只能重装系统。后来在一台服务器上装了 Anaconda,我才彻底明白:在 Ubuntu 上搞 Python 环境,隔离才是第一原则。这篇博文就把我从下载、安装、配置环境变量,到创建虚拟环境、换国内镜像源、最后卸载清理的完整经验一次性写清楚,适合刚接触 Linux、不想在系统 Python 环境里反复踩坑的人,也适合那些装完 Anaconda 之后遇到各种奇怪问题、正在到处搜索解决办法的朋友。

1. 为什么非要在 Ubuntu 上额外装一套 Python 环境

1.1 系统自带 Python 的真实身份是"系统组件"

很多新手最容易忽略的一点是:Ubuntu 自带的 Python 不是你写代码用的,它更像是系统的一个内部依赖。apt包管理器、GNOME 桌面环境、系统设置工具、甚至 Ubuntu 软件中心,背后都在调用系统 Python。你可以执行apt remove python3试一试,系统会直接警告你有一大堆核心软件包要被卸载。

这意味着什么?意味着你如果在系统 Python 里用pip乱装包,特别是给某个库强行升级了版本,很可能破坏系统组件的运行环境。我见过一个特别典型的案例:同事为了装一个深度学习相关工具,在系统 Python 里用pip install --upgrade setuptools,结果第二天系统设置打不开了,跑了好几次apt --fix-broken install才救回来。

1.2 Anaconda 的核心价值就是"隔离"

Anaconda 做的事其实不复杂:它把 Python 解释器、pip、conda 包管理器、还有一大堆常用的科学计算库(NumPy、Pandas、Matplotlib 这些)全部装进一个独立目录里,比如/home/用户名/anaconda3。这个目录和系统/usr/bin/python3完全隔离,两边互不干扰。

你在 Anaconda 自己的环境里怎么折腾都可以——装包、卸包、换 Python 版本、配置不同的依赖组合——都不会影响系统 Python。反过来,系统升级也好、apt 安装软件也好,也不会莫名其妙把你自己装好的库弄坏。这种隔离特性在服务器上更重要,因为服务器通常不止一个人用,或者不止一个项目在跑,环境一旦混乱,排查问题的时间成本高得惊人。

1.3 Anaconda 还是 Miniconda:不要盲目跟风

网上教程里 Anaconda 和 Miniconda 经常混着写,很多新手看哪个火就装哪个。其实这两个东西的关系很简单:Anaconda 自带了几百个常见包,装完基本开箱即用,但体积动辄 3GB 以上;Miniconda 只包含 conda 包管理器和 Python,体积小很多,需要什么包再自己用conda install安装。

我的建议是:如果你主要目的是做数据分析、机器学习、课程作业,磁盘空间也不紧张,直接装 Anaconda,省心;如果你是那种很在意环境干净、习惯精打细算的开发者,或者只是偶尔用用 Python,Miniconda 更合适。我自己一开始装的是 Anaconda,后来发现很多包其实根本用不上,就换成了 Miniconda,日常开发完全没受影响。

2. 安装前的准备工作:架构确认、版本选择与下载加速

2.1 先确认系统架构,这一步很多人忽略了

下载 Anaconda 之前,第一件事不是打开浏览器,而是先确认你的 Ubuntu 是哪种 CPU 架构。这一步看起来多余,但我在论坛里见过不止一个人拿 ARM 版本的 Ubuntu 去下载 x86_64 的安装包,结果执行的时候直接报cannot execute binary file。

在终端里执行:

uname -m

如果输出是x86_64,说明你的系统是 64 位 Intel/AMD 架构,需要下载 x86_64 版本的安装包;如果输出是aarch64,说明是 ARM 架构(比如树莓派、部分国产开发板),需要下载对应的 ARM64 版本。这个信息直接决定了你后面下载哪个文件,千万不能忽略。

2.2 从官网下载还是用国内镜像

Anaconda 的官网下载地址是https://www.anaconda.com/download,进去之后页面会自动检测你的操作系统,点击下载就行。不过在国内网络环境下,直接从官网下载那个几个 GB 的安装包,速度可能会让你怀疑人生。我自己一开始从官网下,进度条动不动就卡住,最后还得靠断点续传工具才拉下来。

更省事的方式是直接用清华大学的开源软件镜像站。在终端里用wget下载:

wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2024.06-1-Linux-x86_64.sh

注意版本号会更新,建议先到镜像站页面确认最新版本号。我一般习惯先打开https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/看一眼有哪些文件,找到一个类似Anaconda3-2024.06-1-Linux-x86_64.sh的文件,复制链接再下载。

2.3 校验文件完整性,防止安装过程莫名其妙报错

下载完安装包之后,强烈建议做一次 SHA-256 校验。这不是跟你有强迫症,而是安装包在下载过程中如果损坏了,后面安装的时候会出现很多莫名其妙的错误,比如解压失败、file not found这类问题。到时候你排查半天,最后发现是安装包下载不完整,白白浪费时间。

在终端里执行:

sha256sum Anaconda3-2024.06-1-Linux-x86_64.sh

输出一串类似8678b0ca3d8f0f2f5f6f7b2dBd82cdfd9c9a0e9f0c7a6f2cc0a2c1f7b2b1d2f的哈希值。把这串值和官网或者镜像站提供的官方哈希值对比一下,一致说明文件没问题,不一致就重新下载。这一步看起来繁琐,但实际只需要十几秒,能省掉后面很大的排查成本。

3. 命令行安装 Anaconda 完整流程

3.1 执行安装脚本,过程中这几个交互选择要留意

下载完成并校验通过后,进入安装包所在目录,执行:

bash Anaconda3-2024.06-1-Linux-x86_64.sh

安装脚本运行后,首先会显示许可协议,内容是 GNU General Public License 相关的说明。你需要按Enter键往下翻页,一段一段看,一直翻到底。翻完之后终端会提示你是否接受许可协议:

Do you accept the license terms? [yes|no]

这里输入yes,然后回车。注意输入的时候不要图快直接按y,它这里要求的是完整输入yes。

接下来是选择安装路径:

Anaconda3 will now be installed into this location: /home/你的用户名/anaconda3 Press ENTER to confirm the location Press CTRL-C to abort the installation Or specify a different location below

默认安装路径是/home/你的用户名/anaconda3。如果磁盘空间允许,我建议直接用默认路径,回车确认就行。不要图省事装到系统目录比如/opt或者/usr/local,因为 Anaconda 需要在当前用户目录下有写权限,装到系统目录可能会遇到权限问题。如果你确实需要装到别的位置,可以输入完整路径,但强烈不建议新手改这一项。

最后还有一个关键提示:

Do you wish the installer to initialize Anaconda3 by running conda init? [yes|no]

这一步要输入yes。很多人在这里手快输入了no,结果装完之后发现conda命令根本找不到,还得手动配环境变量。选择yes之后,安装脚本会自动把 conda 的初始化配置写入到你的~/.bashrc文件里,省去手动配置的麻烦。

3.2 安装完成后的第一次验证

安装脚本跑完之后,当前终端可能还不会立刻识别conda命令,因为~/.bashrc文件虽然被修改了,但当前会话还没有加载新的配置。你需要手动让配置生效:

source ~/.bashrc

执行完之后,你的终端提示符前面应该会出现一个(base)前缀,这代表你已经自动进入了 Anaconda 的基础环境。这时候验证一下是否安装成功:

conda --version python --version which python

conda --version会输出版本号,比如conda 24.5.0;which python应该指向/home/你的用户名/anaconda3/bin/python而不是/usr/bin/python3。看到这个结果,就说明 Anaconda 安装成功,而且正式接管了当前用户的 Python 环境。

3.3 没运行 conda init 的补救办法

有些朋友安装时手快选错了,或者在用某些非交互式终端安装时,可能没有执行conda init,装完之后终端里输入conda会提示command not found。这时候不需要重新安装,手动配置一下环境变量就行。

编辑~/.bashrc文件:

nano ~/.bashrc

在文件末尾追加:

export PATH="/home/你的用户名/anaconda3/bin:$PATH"

保存退出后执行source ~/.bashrc。这样conda命令就能用了。不过这种方式只是简单地把 anaconda 的 bin 目录加入了 PATH,没有执行 conda 的完整初始化逻辑,会缺少conda activate等内置函数的一些辅助配置。更稳妥的办法是安装后手动运行一次:

conda init

它会自动把所有必要的配置写进~/.bashrc,比你手动加 PATH 要全面得多。

4. conda 虚拟环境:为每个项目单独隔离一套 Python

4.1 为什么一定要用虚拟环境

很多从 Windows 上转过来的朋友之前习惯用virtualenv,到了 conda 这里还是习惯装完就用默认环境。在 conda 里,默认环境base相当于你装完 Anaconda 后的初始环境。如果你什么都往base里面塞,时间一长,它就会变成一个"大杂烩"。

虚拟环境的核心价值在于:不同项目对 Python 版本和包版本的要求往往不一样。比如项目 A 需要tensorflow 2.4,项目 B 需要tensorflow 2.10,这两个版本在一个环境里基本不可能和平共处。虚拟环境可以把这两个项目彻底隔离开来,互相不打扰。等哪天不需要了,直接把这个环境删掉,也不会污染其他项目。

4.2 创建与切换虚拟环境的实操

创建一个新环境,指定 Python 版本为 3.9:

conda create -n myproject python=3.9

-n后面跟的是环境名称,你可以自定义,比如pytorch、web_dev、ml_lab等。执行后 conda 会解析依赖关系,并询问你是否继续安装,输入y确认。这里要注意,conda 有时候会卡在Solving environment阶段,后面我会专门讲这个问题。

创建完成后,激活这个环境:

conda activate myproject

激活后,终端提示符前面会从(base)变成(myproject),这表示当前处于myproject环境。此时输入python --version,你会看到这个环境对应的 Python 版本。

退出当前环境:

conda deactivate

这里有个细节值得说:如果你遇到conda activate不起作用,大概率是没有执行conda init导致的。conda activate不只是一个 PATH 切换,它还涉及 shell 函数、环境变量等一整套机制,所以必须确保conda init已经正确执行过。

4.3 环境管理常用命令一览

平时用得最多的几个命令我列一下:

# 查看当前所有环境 conda env list # 查看当前环境下的所有包 conda list # 删除某个环境及其所有包 conda remove -n myproject --all # 复制一个环境 conda create -n new_env --clone old_env # 导出当前环境的依赖列表 conda env export > environment.yaml # 从配置文件创建环境 conda env create -f environment.yaml

其中conda env export是团队协作时特别好用的功能。换机器或者同事想复现你的环境时,直接用这个 yaml 文件就能创建出一模一样的虚拟环境,不用来回拷依赖列表。

4.4 举个实战例子:配置 PyTorch 环境

配置深度学习环境是 conda 最常用的场景之一。我以 PyTorch 为例,走一遍完整流程。

首先创建 Python 3.9 的环境:

conda create -n pytorch python=3.9 -y

激活环境:

conda activate pytorch

然后在 PyTorch 官网查询当前适合你机器配置的安装命令。如果用的是 NVIDIA 显卡,需要先确认 CUDA 支持情况,然后执行类似:

conda install pytorch torchvision torchaudio cudatoolkit=11.8 -c pytorch

如果你的电脑没有 NVIDIA 显卡,或者不想用 GPU,可以直接装 CPU 版本:

conda install pytorch torchvision torchaudio cpuonly -c pytorch

等安装完成,在 Python 里执行:

import torch print(torch.__version__) print(torch.cuda.is_available())

如果torch.cuda.is_available()返回True,说明 GPU 版本的 PyTorch 配置成功。这一步是很多人配置环境之后必做的验证,确认 GPU 真的能被调用。

5. 换国内镜像源:彻底告别 conda 安装包的龟速和报错

5.1 为什么默认源在国内这么不稳定

conda 默认使用的软件源是https://repo.anaconda.com,服务器在国外,国内访问经常出现速度极慢,甚至直接超时的情况。我印象最深的是有一次conda create -n test python=3.9,光是解析依赖就等了十几分钟,下载到一半直接报CondaHTTPError: HTTP 000 CONNECTION FAILED,那叫一个崩溃。

要解决这个问题,最有效的办法就是把 conda 的软件源指向国内镜像。目前比较稳定、社区使用最广泛的是清华大学的开源软件镜像站。

5.2 命令行配置清华镜像源

在终端里逐条执行以下命令:

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ conda config --set show_channel_urls yes

说明一下这几条命令做了什么事:前三条把清华镜像站的不同仓库添加到 conda 的频道列表里,conda 会优先从这些频道下载包;最后一条是设置show_channel_urls为yes,这样你在安装包的时候能看到它是从哪个源下载的,方便排查问题。

顺手把 pip 的源也换成国内的,在终端执行:

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

这样以后用pip install装包也会走国内镜像,速度提升非常明显。

5.3 conda 配置文件 .condarc 的正确写法

命令行配置最终会写入用户目录下的~/.condarc文件。如果你喜欢直接改文件,也可以手动编辑它:

nano ~/.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 - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

这里default_channels主要针对defaults频道,custom_channels则是一些常用社区频道,比如conda-forge和pytorch。修改完成后执行:

conda clean -i

清理一下索引缓存,然后重新执行安装命令时,下载速度就会有质的提升。

5.4 换源后依然报错的排查思路

换源之后如果还是出现CondaHTTPError,不要急着认为镜像源没用。按经验来说,可能是这几个方面的问题:

第一,检查网络环境,看能否访问镜像站。终端里执行curl -I https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/,看返回的 HTTP 状态码是不是 200。第二,检查.condarc格式是否正确,YAML 对缩进很敏感,一个多余空格都可能导致解析失败。第三,如果公司网络或者校园网本身有认证,镜像站虽然能访问,但域名解析出问题,可以尝试换成https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main不带末尾的斜杠,或者改用其他镜像站比如阿里云的源。

6. 卸载 Anaconda:用不上的时候怎么干净移除

6.1 什么时候需要卸载

可能有人觉得,装都装了,为什么要卸载?实际上我遇到过几种情况:装错了版本(比如下载了 ARM64 包后想换 x86_64)、公司要求统一用 Miniconda、或者环境彻底被自己搞坏了不想排查,干脆重装。这时候如果能干净地卸载,后面重新安装会省很多事。

6.2 使用官方清理工具 anaconda-clean

Anaconda 官方提供了清理工具,在卸载之前先执行这个工具,可以备份或删除配置文件。

首先安装清理工具:

conda install anaconda-clean

然后执行清理:

anaconda-clean --yes

--yes参数表示对所有确认提示都回答 yes,省略这个参数的话每删一个文件都会问你一次,效率很低。执行完这条命令之后,它会自动把~/.condarc、~/.conda、~/.continuum这些配置目录备份到同名的.backup目录下。

6.3 删除主目录并清理 shell 配置

清理完配置文件之后,删除 anaconda 主目录:

rm -rf ~/anaconda3

然后打开~/.bashrc,找到安装时 conda 自动追加的那段初始化代码,大约在文件末尾,内容是:

# >>> conda initialize >>> # !! Contents within this block are managed by 'conda init' !! __conda_setup="$('/home/你的用户名/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)" if [ $? -eq 0 ]; then eval "$__conda_setup" else if [ -f "/home/你的用户名/anaconda3/etc/profile.d/conda.sh" ]; then . "/home/你的用户名/anaconda3/etc/profile.d/conda.sh" else export PATH="/home/你的用户名/anaconda3/bin:$PATH" fi fi unset __conda_setup # <<< conda initialize <<<

把这一整段从# >>> conda initialize >>>到# <<< conda initialize <<<删除。如果之前在~/.bashrc里手动添加过export PATH那行 conda 路径,也要一并删掉。最后执行source ~/.bashrc让配置生效。

6.4 卸载彻底不彻底怎么验证

清理完成后,关掉当前终端,重新打开一个新的终端窗口,输入:

conda --version

如果提示command not found,说明 conda 已经从你的 PATH 和 shell 配置里彻底移除了。再执行:

echo $PATH | tr ':' '\n' | grep -i anaconda

如果没有任何输出,说明 anaconda 相关的路径已经不存在于 PATH 中了。这个时候系统就恢复到了没装 Anaconda 之前的状态。

7. 我在安装与使用中踩过的坑和最终解法

7.1 conda 命令找不到,环境变量配置错误是重灾区

这是我在网上看到出现频率最高的问题。很多人装完 Anaconda 之后,输入conda --version得到command not found,第一反应就是感觉安装失败了。其实大概率是环境变量没有配好。

排查思路是这样的:先看/home/你的用户名/anaconda3/bin/conda这个文件是否存在,如果存在,说明安装没有问题,问题出在 PATH 配置上。检查~/.bashrc里有没有 conda 相关的配置,如果完全没有,就手动补上。如果文件中存在配置但还是找不到,有可能是执行配置时当前 shell 没有重载,跑一下source ~/.bashrc即可。

有些人可能会把export PATH="/home/用户名/anaconda3/bin:$PATH"写成:

export PATH="/home/用户名/anaconda3/bin"

注意这里少了:$PATH,这意味着你完全把原有的 PATH 覆盖了!执行之后终端里面ls、nano这些基础命令会全部失效,非常危险。我见过有朋友在配置的时候手滑写成这种形式,然后终端基础命令全挂,只能通过绝对路径去调用命令来修复。所以配置 PATH 的时候,$PATH一定要保留。

7.2 安装程序卡在 loading applications 不动

这个问题在部分配置较低的机器上比较常见。Anaconda 安装脚本执行到最后,会有一个loading applications阶段,它需要扫描系统中已有的应用程序来建立关联。如果机器内存不足或者磁盘 IO 性能较差,这一步可能会卡很久。

我的建议是耐心等 3 到 5 分钟,如果确实没有反应,可以考虑强制中断安装然后重来,或者换用 Miniconda。另外,如果你是在虚拟机里安装 Ubuntu,建议在安装 Anaconda 之前给虚拟机多分配一些内存和 CPU 核心,这个阶段的卡顿概率会明显降低。

7.3 激活环境时出现 warning 提示

有朋友在激活 conda 环境时,终端会输出一段提示:

WARNING: A conda environment already exists at 'xxx'

这种提示通常出现在你切换环境或者重启系统后。原因一般是当前目录下的.conda缓存信息与实际的 conda 环境配置存在不一致,或者是之前直接复制过整个anaconda3目录到另一台机器,导致环境路径记录的是旧机器的路径。

解决办法是清理 conda 的缓存:

conda clean --all

如果问题依然存在,检查环境配置文件中记录的路径:/home/你的用户名/anaconda3/envs/环境名/conda-meta下的文件,确认其中记录的路径是否与当前实际安装路径相符。

7.4 默认进入 base 环境,想关掉自动激活怎么做

装完 Anaconda 之后,打开终端默认就会进入(base)环境,这是正常现象。原因在于安装脚本在~/.bashrc里自动加入了 conda 初始化逻辑,默认激活了 base 环境。如果你不想每次打开终端都自动进入 base,可以执行:

conda config --set auto_activate_base false

设置完之后,重启终端就不会再有(base)前缀了。想激活环境的时候再手动执行conda activate 环境名就行了。这个配置不少人喜欢保留默认 true,特别是做数据分析的人,因为 base 环境本身已经预装了很多常用库,打开终端直接用。但如果你注重干净,或者主要在虚拟环境里工作,关掉自动激活体验更好。

7.5 Solving environment 一直转圈、卡死怎么处理

conda create或者conda install的时候,终端停在Solving environment阶段长时间不结束,这是另一个高频问题。根本原因是 conda 的依赖求解器在处理依赖关系时计算量很大,尤其在默认源很慢或者有大量包需要解析索引的情况下。

一个有效解法是切换 conda 的求解器,使用 libmamba 求解器,它比默认的 classic 求解器快很多。执行:

conda update -n base conda conda install -n base conda-libmamba-solver conda config --set solver libmamba

配置完之后,再跑conda install时你会发现依赖解析速度提升非常明显。我换了这个求解器之后,之前一个要等十分钟的环境创建过程,现在几十秒就能完成。

还有一个相对"笨"但很有效的办法:创建环境时直接指定具体版本号,减少求解器的计算范围。比如conda create -n myproject python=3.9 numpy=1.24 pandas=2.0,一次性把所有主要包写全,比分多次安装要快得多。

7.6 Pycharm 怎么接入 Anaconda 环境

很多用它做开发的朋友踩过连接环境的坑。在 PyCharm 里接入 Anaconda 其实很简单:打开Settings->Project: xxx->Python Interpreter,点击右上角的齿轮图标,选择Add Interpreter->Add Local Interpreter。这里有两个选项,如果是直接用 Anaconda 的 base 环境,就选Conda->Existing environment,然后 Interpreter 路径选/home/你的用户名/anaconda3/bin/python;如果是想用之前创建的虚拟环境,就把路径指向/home/你的用户名/anaconda3/envs/你的环境名/bin/python。

选完路径之后,PyCharm 会自动读取该环境下的包列表,项目运行时就会使用 conda 环境里的 Python 解释器,跟终端conda activate的效果一样。注意不要选成/usr/bin/python3,否则 PyCharm 用的还是系统 Python,就完全没发挥 Anaconda 的隔离作用了。

7.7 关于 Anaconda 和系统 Python 共存的最后一点经验

最后分享一个我觉得最容易被新手误解的地方。装完 Anaconda 之后,你在终端输入python,默认进入的是 Anaconda 的 Python,但这不代表系统 Python 被删掉了。它们两个是并存的,只是 PATH 的优先级决定了默认用哪个。

要查看系统 Python 还在不在,可以用绝对路径:

/usr/bin/python3 --version

如果哪天 Anaconda 被卸载了,只需要恢复 PATH 配置就能回到系统 Python,不会说系统 Python 因为装过 Anaconda 就"坏掉"了。搞懂了这个逻辑,以后你在 Ubuntu 上配置 Python 环境,心里就有底了:系统 Python 是系统的人,Anaconda 是你自己的人,两者互不干涉,各干各的活。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/29 1:09:09

边缘AI芯片选型:从场景反推才是落地第一课

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/29 1:09:04

eWebEditor 11.0 中文商业版实战:Word导入清洗与IIS部署避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/29 1:08:56

STM32+FPGA工业控制器分级存储设计:EEPROM/NOR Flash/SD卡实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/29 1:08:56

台达A2-M伺服驱动器CN3口Modbus RTU串口控制实战详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/29 1:08:24

Python泛型实战:从TypeVar到Protocol的数据转换服务

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/29 1:08:15

用 GitHub Actions 自动同步 Fork 上游:cron+YAML

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华