news 2026/9/28 19:34:52

树莓派多版本Python共存,如何干净卸载指定版本且不影响系统?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
树莓派多版本Python共存,如何干净卸载指定版本且不影响系统?

刚折腾完树莓派上的Python多版本共存问题,踩了一圈坑之后发现,真正麻烦的不是安装某个版本的Python,而是卸载一个已经被各种依赖“焊死”的指定版本。尤其是在树莓派这种资源紧张的板子上,多个Python版本共存会把环境变量、软链接、pip插件、编译缓存搅成一锅粥,而卸载那个“多余版本”时稍微手一抖,系统自带的Python可能被连带弄坏,连apt都用不了。

这篇内容就聚焦一个问题:如何在树莓派系统里干净地卸载指定版本Python,并且不影响其他版本继续正常工作。适合那些装过多个Python版本、想把环境整理干净的人阅读。无论你是为了给YOLO、OpenCV这类视觉项目腾空间,还是因为某个Python版本跟摄像头库或GPIO库冲突想回滚,这篇文章都能帮你理清思路。

1. 先搞清楚:这个Python到底能不能卸

1.1 区分系统Python与自装Python

很多人一上来就执行rm -rf /usr/bin/python3,这是最危险的动作。树莓派官方系统(Raspberry Pi OS)自带Python,而且系统底层大量工具都在使用它。apt包管理器、raspi-config配置工具、网络管理模块,甚至桌面环境的某些组件,都是基于系统自带的Python版本运行的。贸然删掉这个版本,轻则提示No module named 'apt',重则直接导致系统无法启动桌面或无法联网。

所以动手前第一件事,先分辨“系统自带的Python”和“你自己后来装的Python”。系统自带的一般位于/usr/bin/下,包管理器记录在dpkg数据库里;而自己编译安装或通过其他方式装的多半在/usr/local/bin/或/opt/目录下,没有dpkg记录。

判断方法很简单,在终端输入:

type -a python3.9 which python3.9 dpkg -S $(which python3.9) 2>/dev/null

如果dpkg -S能返回一个类似python3.9-minimal: /usr/bin/python3.9的结果,说明这个版本是apt装的;如果返回dpkg-query: no path found matching pattern,那它就是手动编译安装的。这条信息决定了你后面要选哪条卸载路线。

有几种常见场景我是强烈建议卸载Python指定版本的:

  • 源码编译安装了一个新版本,却把系统原来默认的Python软链接覆盖了,导致系统工具链混乱;
  • 为了跑某个库(比如特定版本的TensorFlow或PyTorch)装了一个Python,后来项目废弃了,版本纯粹占空间;
  • 树莓派上的多个Python版本之间冲突,pip安装的包互相污染,你确定只保留某个版本。

我个人的习惯是:树莓派系统级的Python版本绝不轻易卸载,除非我确定系统里没有任何脚本依赖它。换句话说,卸载目标应当是“多出来的、可替代的那个版本”,而不是最基础的运行环境。

1.2 确认安装方式与受影响的范围

我们日常在树莓派上安装Python的无非三种方式:

  1. apt直接安装:比如sudo apt install python3.11,装完由dpkg管理系统记录,卸载时用apt remove就能干净处理;
  2. 源码编译安装:自己下载tar包、./configure、make && make install,安装路径通常为/usr/local/,没有dpkg记录,卸载要手动清除文件和相关软链接;
  3. pyenv或虚拟环境安装:通过pyenv管理,或者某个项目目录下用python3 -m venv创建的虚拟环境,这类“版本”通常只在特定目录或特定shell会话里生效,卸载方式跟前面两类完全不同。

从热搜词来看,“树莓派5上部署自己训练的yolov5模型”“树莓派opencv物体识别”“树莓派控制舵机”这类场景占了很大比例。如果你是因为做AI视觉或硬件控制项目才安装的多余Python,那还要额外留意:这些项目依赖的Python包大概率安装在dist-packages或site-packages里,卸载Python之后这些包不会自动消失,会留下垃圾文件,后面我会专门讲怎么清理。

1.3 卸载前的系统备份与依赖快照

动手之前,先给当前环境拍个快照。这一步很多人跳过,但真出问题时后悔都来不及。

先保存当前已经安装Python包清单,方便卸载后对比和清理:

pip3 list > ~/pip-list-backup.txt python3.9 -m pip list > ~/pip-list-python39.txt

然后记录当前软链接的具体指向:

ls -la /usr/bin/python* ls -la /usr/local/bin/python*

可以从这些内容里看到python3指向了哪个版本,python3.9、python3.11各自在哪里。把输出内容保存成文本,后续恢复环境时能省去大量排查时间。

另外建议执行一次完整的系统更新,确保apt数据库状态正常后再卸载:

sudo apt update sudo apt upgrade -y

我踩过坑:如果apt的依赖状态本身就是坏的,卸载一个Python包时可能触发连锁反应,把一堆无关包拖下水。

2. 卸载前的检查清单(动手前必看)

2.1 查看已安装版本与对应路径

在决定卸载之前,先完整摸清系统里到底有几个Python版本。推荐用以下命令组合:

ls /usr/bin/python* ls /usr/local/bin/python* python3 --version

还可以用apt专门列出所有跟Python相关的已安装包:

dpkg -l | grep python

这条命令会输出一大堆python3-开头的软件包。注意,即使你只装了python3.11一个版本,系统里也会有一堆python3-xxx的库包(如python3-apt、python3-gpiozero、python3-picamera等),这些不要动,它们不是“Python版本”,而是Python的第三方模块包。

区分“版本本体”和“模块包”是这篇内容里最重要的一条经验。版本本体是python3.9、python3.11这种二进制解释器,模块包是给解释器提供功能的库。卸载版本时,如果误删了系统依赖的模块包,会造成功能缺失;反过来,只删版本、留着一堆模块包,就会形成“死依赖”,让apt状态不健康。

真正需要卸载的“指定版本”,在dpkg列表里通常是这样几个包:

  • python3.9
  • python3.9-minimal
  • libpython3.9-stdlib
  • libpython3.9-minimal

如果当初是用源码编译安装的,那在dpkg -l | grep python里看不到对应条目,需要手动检查/usr/local/bin/目录下是否存在这个版本的二进制文件。

2.2 查询哪些软件在依赖这个Python

这个检查是防止“卸载A却弄坏B”的关键步骤。我之前就是因为没做这一步,卸载掉一个“觉得没用”的Python版本后,发现系统桌面环境崩了,因为对方依赖的就是那个版本。

可以用apt自动计算依赖关系:

apt-cache rdepends python3.9

或者查看具体某个软件依赖的Python版本号:

apt-cache depends python3-apt

这条会显示python3-apt具体依赖python3 (>= 3.x),如果卸载的Python版本是这个依赖条件里唯一能满足的版本,就会被牵连损坏。

从热搜词里能看到不少人要在树莓派4B或树莓派5上跑OpenCV、YOLOv5、摄像头识别等任务,这类项目通常依赖python3-opencv、python3-numpy等系统级包。这些包往往是跟随系统Python版本走的,如果你卸载了系统默认Python版本,或调整了/usr/bin/python3软链接指向,这些包会立刻无法导入。所以卸载之前,务必用上面的rdepends命令查一下,把受影响范围列成一张“依赖名单”,再判断这个版本能不能卸。

2.3 记录当前环境变量与软链接

树莓派上的Python版本之所以互相打架,很大程度是PATH环境变量和软链接在捣乱。which python3返回的是/usr/bin/python3,这个位置通常是一个软链接,指向某个具体版本,比如python3.7 -> python3.11。如果你卸载了软链接指向的那个版本,会直接出现bash: /usr/bin/python3: No such file or directory。

所以检查完依赖之后,把当前系统里所有跟Python相关的软链接都记录下来:

readlink -f /usr/bin/python3 readlink -f /usr/bin/python readlink -f /usr/local/bin/python3

同时检查用户目录下的环境变量配置:

grep -n python ~/.bashrc ~/.profile 2>/dev/null

如果~/.bashrc里有alias python=/usr/local/bin/python3.9这类别名,或者PATH变量里手工加入了/usr/local/bin,这都可能导致卸载后命令仍然指向一个不存在的文件。把检查结果记录下来,后面清理软链接时会非常有用。

3. 三种卸载方式详解与选择

3.1 方式一:apt卸载官方源安装的Python

对于通过apt install安装的Python版本,这是最正规、最安全的卸载方式。以卸载Python 3.9为例:

sudo apt remove python3.9

系统会提示即将删除的软件包列表和额外会被自动移除的依赖包,仔细看一眼列表,确认没有删到python3-apt这类关键包之后,输入Y确认。

如果想要连配置文件一并删干净,用purge:

sudo apt purge python3.9 libpython3.9-stdlib python3.9-minimal

之后执行一次自动清理:

sudo apt autoremove

autoremove会清除掉那些因为安装Python 3.9而自动拉进来、现在不再被需要的依赖包。注意,这一步也可能删掉某些“恰好也是其他软件依赖”的包,所以执行autoremove前还是先看一眼提示列表比较稳妥。

用apt卸载的优点是干净、自动、可追踪,缺点是你只能通过这种方式卸载“apt记录在案”的版本。如果你当初不是用apt装的,执行apt remove python3.9时会看到“软件包 python3.9 未安装,所以未被卸载”的提示,这时候请转用3.2节的方法。

卸载完成后,验证一下:

python3 --version ls /usr/bin/python3.9 2>&1

如果ls提示没有这个文件,说明版本本体已经清除。这时候还要检查python3软链接是否仍然有效,如果原软链接指向已被删除的版本,需要先修复软链接(方法见第4章)。

3.2 方式二:清理源码编译安装的Python

源码编译安装的Python是树莓派玩家最常见的“事故来源”。很多人下载Python 3.10或3.11的源码包,在树莓派上编译安装之后,整个系统环境就乱了,想卸载却发现apt根本不认识它。

清理源码安装的Python主要看两样东西:一是当初编译安装的源码目录是否还在,二是在/usr/local/下生成的文件列表。

如果你还留着源码目录,进入目录后执行:

cd ~/Python-3.9.18 sudo make uninstall

make uninstall会读取Makefile里记录的所有安装路径,将对应文件一一删除。这是最省心的源码卸载方式。

但很多人编译之后就删了源码目录,那就只能手动清理。先确定安装路径:

which python3.9 ls -la /usr/local/bin/python3.9*

手动删除时,需要逐个处理二进制文件、软链接和库文件:

sudo rm /usr/local/bin/python3.9 sudo rm /usr/local/bin/python3.9-config sudo rm -r /usr/local/lib/python3.9 sudo rm -r /usr/local/include/python3.9

另外,/usr/local/lib/目录下可能还有一个pkgconfig文件需要处理:

sudo rm /usr/local/lib/pkgconfig/python-3.9.pc sudo rm /usr/local/lib/pkgconfig/python3.9-embed.pc

源码编译安装的Python还会留下一些特殊目录,如/usr/local/lib/python3.9/site-packages,里面装着通过pip手动装进去的包。make uninstall和手动删除二进制都只会删除Python本体,不会清除site-packages里的第三方包,这些目录需要单独删除,否则会残留几十到几百MB的垃圾文件。我用的是:直接删掉整个/usr/local/lib/python3.9目录,最省事。

3.3 方式三:删除pyenv或venv里的Python

如果你的树莓派环境用了pyenv管理Python版本,那卸载起来就要小心,因为pyenv管理的Python和系统级Python是隔离的。卸载pyenv里的某个版本,只需:

pyenv uninstall 3.9.18

这个命令会在pyenv的版本目录(通常在~/.pyenv/versions/3.9.18)里把该版本完整清除。如果你确定某个pyenv版本不再需要,这个命令是最干净的,不需要任何额外操作。

如果你当初是在某个项目目录下创建了虚拟环境,比如:

python3 -m venv ~/myproject/venv

那要卸载的是整个虚拟环境目录,而不是Python解释器。直接删除该目录即可:

rm -rf ~/myproject/venv

删除虚拟环境不会影响系统里的其他Python版本,因为venv本质上是把某个Python解释器和一套隔离的site-packages做成了独立目录。但是注意:这个目录里可能由项目积累了很多key的包,删除之前确认一下这个项目确实不再需要这些依赖了。

从实操角度看,树莓派上很多人用了虚拟环境还浑然不知——我之前帮人排查问题时发现,他每次激活虚拟环境后装的OpenCV、numpy全都堆积在那一个目录里,占用了几百MB存储空间。这种就属于“版本还在但空间已经不够用”的典型场景,删掉虚拟环境比卸载Python本体更有意义。

4. 卸载后的清理与恢复

4.1 清理软链接与命令入口

不管你是用哪种方式卸载的Python,卸载结束后都必须检查软链接是否还有失效的残留。因为树莓派上大量项目是直接调用python3或python命令的,而这些命令名往往指向某个具体版本。如果原来的软链接文件还在,但目标文件已经被删除,执行任何Python脚本都会报错。

先看当前python3命令是否还能用:

python3 --version

如果提示-bash: /usr/bin/python3: No such file or directory,说明软链接已经失效,需要重建。

把软链接指向一个仍然存在的Python版本,比如3.11:

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1

或者直接用ln命令建立软链接:

sudo ln -sf /usr/bin/python3.11 /usr/bin/python3

这里要特别说明:update-alternatives比直接改软链接更安全,因为它会记录优先级,未来有多个版本共存时,能通过update-alternatives --config python3自由切换。这是在树莓派上管理多个Python版本的正确姿势,比你手动改/usr/bin/python3指向要稳固得多。

如果你之前给python命令设置过别名,也要同步修改。检查~/.bashrc和~/.zshrc中的相关配置,删除或更新指向已卸载版本的写法。

4.2 清理pip残留包与缓存

Python卸载后最大的问题是:第三方包残留。特别是源码编译安装的Python,其site-packages目录大概率还在磁盘上,占着不少空间。

对于apt卸载的情况,残留的风险相对小,因为apt在移除python3相关包时,会自动清理/usr/lib/python3/dist-packages下属于该版本的库文件。但对于/usr/local/lib/下的残留,基本靠手动。

清理思路很简单:找到你卸载的那个Python版本的site-packages目录,直接整个删掉。

sudo rm -r /usr/local/lib/python3.9/site-packages

如果之前用pip为这个版本安装过很多包,而你现在又要用另一个版本继续跑项目,那还要检查新版本环境里是否缺少关键包。比如从Python 3.9切换回Python 3.11后,项目需要的opencv、numpy等包需要在新版本里重新安装:

python3.11 -m pip install --upgrade pip python3.11 -m pip install opencv-python numpy

另外树莓派上还有一个容易被忽略的缓存目录,~/.cache/pip,里面存着pip下载过的wheel包。如果空间紧张,可以顺手清理:

rm -rf ~/.cache/pip

清理之后,用df -h /看一下根分区的可用空间变化——这一步能直观看到清理效果。

4.3 检查系统关键功能是否恢复

卸载Python后,第一步先确认apt还能正常工作:

sudo apt update

如果apt报错,大概率是因为系统Python版本被破坏或dpkg状态混乱。处理办法是用apt-get install -f自动修复依赖:

sudo apt-get install -f

如果修复无效,可能要重装基础Python包。实测中一个比较有效的命令组合是:

sudo apt install --reinstall python3-minimal python3-apt

再进一步,检查raspi-config之类的官方配置工具是否还能用:

sudo raspi-config

如果raspi-config启动不了,通常是因为它依赖的python3或python3-gi模块版本不匹配导致,需要针对性重装:

sudo apt install --reinstall python3-gi

我在树莓派4B上卸载Python 3.9后遇到过一次raspi-config无法打开的问题,当时就是用这条命令修复的。原因是python3-gi是GTK的Python绑定,系统桌面配置界面依赖它,如果它链接的是被卸载的那个版本库,就会加载失败。

4.4 树莓派特有依赖的修复

树莓派上跟外围硬件相关的Python库,比普通Linux发行版更多。这部分在卸载Python指定版本时要格外小心。常见的有:

  • python3-rpi.gpio:GPIO引脚控制库;
  • python3-gpiozero:更为通用的GPIO控制库;
  • python3-picamera:官方摄像头模块库;
  • python3-smbus:I2C总线控制;
  • python3-spidev:SPI接口控制。

这些库通常以软件包的形式挂在系统Python版本下面。卸载某个指定Python版本时,如果恰好把这些包也删掉了(比如apt autoremove误伤),重新安装方式如下:

sudo apt install --reinstall python3-rpi.gpio python3-gpiozero sudo apt install --reinstall python3-picamera python3-smbus

检查是否恢复成功,可以这样测试GPIO库:

python3 -c "import RPi.GPIO; print(RPi.GPIO.VERSION)"

如果报错,先检查有没有安装pip版的GPIO库(有时是从源码装的,跟apt的记录不一致):

pip3 list | grep -i gpio

有冲突时先pip uninstall RPi.GPIO,再重新用apt安装。

摄像头模块在树莓派上经常是项目核心(从热搜词树莓派ov5647摄像头模块可以看出这个需求的人很多)。如果你卸载Python版本后摄像头采集代码报ImportError: No module named 'picamera',安装方式:

sudo apt install python3-picamera

需要强调的是,python3-picamera只适配树莓派官方系统自带的Python版本。如果你用的是自己通过源码编译安装的Python,这个库极大概率装不进去或运行异常。这也是一个值得记住的规律:树莓派硬件库优先适配系统Python,自己编译的Python版本在跑GPIO和摄像头这类硬件操作时,踩坑的概率会高很多。

5. 踩坑实录:我卸载Python时遇到的那些问题

5.1 误删系统Python导致apt失效

这个坑我印象最深。有一次在树莓派上想清理Python版本,执行了sudo apt remove python3——注意是python3而不是python3.x,结果整个系统网络和软件管理功能都瘫了。apt报错说找不到/usr/bin/python3,很多管理脚本全挂。

如果已经走到这一步,还有救命的操作:从Live镜像或另一台机器上启动树莓派SD卡,挂载原系统分区后,手动重装python包。或者,如果你的树莓派系统里还有另一个版本的Python,可以先恢复软链接:

sudo ln -s /usr/bin/python3.9 /usr/bin/python3

然后重建apt的Python依赖:

sudo apt-get install -f

但问题是,如果apt自己都跑不起来,那这个修复命令也执行不了。更底层的兜底办法是:直接用dpkg强制修复,绕过apt:

sudo dpkg --configure -a

这条命令会自动重新配置所有处于半安装状态的包,实测在“Python被移除但apt保留”的场景下有奇效。

所以最稳妥的原则依然是:卸载目标指定到具体版本号,而不是笼统的python3。python3是一个逻辑入口,卸掉它等于拆掉整个系统的依赖地基。

5.2 摄像头和GPIO库被连带删掉

有一次卸载Python 3.10时,apt autoremove顺手删掉了python3-picamera和python3-rpi.gpio,我当时没看提示列表,直接确认了清除。结果项目启动时摄像头怎么也打不开,GPIO口也控制不了,排查半天才发现是这两个库被一并清掉了。

重新安装很简单:

sudo apt install python3-picamera python3-rpi.gpio python3-gpiozero

但问题在于,如果你项目里的脚本是用被卸载的Python版本运行的,那装了库也没用——因为新安装的系统库默认事件触发在默认Python上,而项目的解释器已经被你删了。所以这里又回到第三章的思路:确认你项目的运行解释器是哪一个版本,卸载之前先把项目迁移到保留版本上。

5.3 pip命令消失与重装方案

卸载Python指定版本后,系统里的pip命令可能也会失效。这取决于你卸载的是哪个Python版本、pip命令是哪个版本生成的。如果出现pip: command not found,先检查当前默认Python还有没有pip模块:

python3 -m pip --version

如果提示No module named pip,说明需要补齐pip。树莓派上通常用系统包安装:

sudo apt install python3-pip

如果用的是apt源里的旧版pip,而且你需要给指定版本安装新包,可以用官方脚本引导安装:

curl -sS https://bootstrap.pypa.io/get-pip.py --output get-pip.py python3 get-pip.py

需要说明的是,树莓派官方系统的apt源里pip版本可能滞后,如果遇到包版本过低问题,用python3 -m pip install --upgrade pip升级即可。

另外有一种情况值得提醒:pip有多个版本时,你执行pip3 install xxx,装的包只会进入当前关联的Python环境。如果后续运行脚本用的又不是这个环境,就会出现“明明装了却找不到”的错觉。这也是为什么我会建议在树莓派上改用python3.x -m pip这种带版本号的方式,从命令层面就把环境锁死。

5.4 常见问题速查表

问题表现解决方案
python3命令失效提示No such file or directorysudo ln -sf /usr/bin/python3.11 /usr/bin/python3重建软链接
apt无法正常工作执行任何apt命令都报Python相关错误sudo apt-get install -f或sudo dpkg --configure -a
pip模块丢失python3 -m pip报No module named pipsudo apt install python3-pip或使用get-pip脚本重新安装
GPIO库找不到导入RPi.GPIO报ModuleNotFoundErrorsudo apt install --reinstall python3-rpi.gpio
摄像头库失效picamera无法导入sudo apt install python3-picamera
桌面环境无法启动登录界面或桌面依赖Python组件崩溃重装python3-gi和python3-gtk相关包
编译残留大量垃圾文件/usr/local/lib下多个python版本目录手动删除对应版本的lib、include、bin目录

每条解决方案我用过再补充一点:不要在一个问题没解决时就急着去执行下一个装包命令,这样很容易掩盖真实问题。先把当前报错彻底解决,再继续。

6. 基于经验的小建议

正常情况下我建议把树莓派当作一个“准服务器”来管理,而不是频繁变动基础环境的实验板。如果确实需要多版本Python干活,用pyenv或虚拟环境隔离,比在系统级硬怼多个版本稳妥得多。我自己的固定流程是:系统自带Python版本绝不动,跑项目的Python一律用虚拟环境,这样卸载某个项目环境时,只需要rm -rf那个虚拟环境目录,系统级依赖毫发无伤。

再分享一个小技巧。树莓派上删完一个Python版本后,别急着扔SD卡,用du -sh /usr/lib/python* /usr/local/lib/python* ~/.cache/pip 2>/dev/null看一下实际磁盘占用,再结合df -h看剩余空间。这样才能确认自己到底清理出了多大空间,也能发现哪些版本的目录是你没注意到而残留下来的。

卸载Python指定版本这事本身不复杂,真正的难点在于“系统中什么在悄悄依赖它”。先查依赖,再做软链接快照,最后选择对应的卸载方式,三步走完,树莓派的环境基本不会翻车。如果你也遇到过其他奇怪的卸载问题,欢迎在评论区交流,我看了会尽力帮你分析。

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

感应耐压试验中电压升不上去可能是什么原因(一)

用100kW感应耐压测试系统做变压器或互感器感应耐压试验时,有时会遇到电压升不到规定值的情况。调压器已经调到较高位置,电压表读数却停滞不前,或者电流已经接近限幅而电压仍达不到目标。遇到这种情况,需要从试品状态、系统配置和回…

作者头像 李华
网站建设 2026/9/28 19:33:30

嵌入式烧录与仿真调试工具链详解:原理、选型与排错实战

刚入行那会儿,我接过一块板子,把ST-Link杜邦线往SWD接口上一插,打开Keil点击下载,满心期待地等固件跑起来,结果弹窗一句No target connected。当时真是懵了,后来才发现不过是四根线里有一根接触不良。这个场…

作者头像 李华
网站建设 2026/9/28 19:33:30

从安全评审到持续监控:企业 Agent 安全态势感知平台架构

在大模型智能体(Agent)全面介入生产、运维、客服和金融业务后,单纯依赖上线前的静态安全评审已无法抵御运行时的动态风险。Agent 的行为具备自适应性、长短期记忆演化和多步骤自主决策能力,外部攻击者可能在数小时或数天的交互中通…

作者头像 李华
网站建设 2026/9/28 19:33:24

向量数据库冷启动加速:生产环境落地指南

在将大规模高并发向量数据库(如 Milvus / Qdrant / Faiss)部署在企业级生产环境(Kubernetes / 私有云物理机)时,新节点扩容或灾难恢复时的**“冷启动延迟治理(Cold-Start Mitigation)”** 直接决…

作者头像 李华
网站建设 2026/9/28 19:33:10

Spring AI MCP 工具调用测试:用 ChatClient 打通 Java 侧配置链路

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

作者头像 李华