pip install超时?一行命令换镜像源彻底解决
写这篇文章的起因非常简单又双叒叕看到有人在群里发截图安装一个不到几十KB的第三方库卡在ReadTimeoutError上报了一整屏的错。说句实话pip install报超时这在 Python 开发者的日常里早就不是什么新鲜事了属于那种“看着不大但真打断节奏”的经典问题。但你让我说公道话它其实是最不值得花时间排查的问题之一因为最有效的解法短到只有一行命令比百度错误日志、反复删除缓存重试都要快得多。这篇文章就跟你把这行命令讲透从它为什么能解决问题到临时救急、永久配置、批量安装、离线兜底的全套玩法都过一遍。不管你刚接触 Python 没几天还是已经写了几年代码看完都能直接用上。1. 先搞清楚报错背后的真正原因1.1 官方源慢是“先天问题”很多人第一次遇到pip install xxx卡住时的第一反应是“网络不好”然后把电脑连的手机热点反复开关几次再重试结果还是超时。实际上问题不在你的网络而是 pip 默认去下载第三方库的地方——PyPI 官方源——跟你之间的网络链路实在太长了。简单打个比方你住在 A 城官方源服务器在离你十万八千里的地方你要从它那儿搬一箱货中间要过无数收费站、检查点、拥堵路段。遇到高峰期或者赶上某条线路出故障箱子在路上多停了一会儿单方面约定好的等待时间不够你就直接放弃了。换成你楼下的仓库哪怕规模小一点那也是几步路的事来回一趟快得多。pip默认的下载地址是https://pypi.org/simple域名对应的服务器不在国内。访问它的时候DNS 解析、TCP 握手、TLS 握手全都要在一条高延迟低稳定性的链路上完成其中一个环节慢一点超时就成了家常便饭。而且这种慢并不是固定的同一个包白天也许能装上晚上高峰期就各种超时玄学得很。1.2 超时不是偶发现象常见报错类型速认把常见的超时报文摆出来你以后一眼就能判断是不是这个问题ReadTimeoutError: HTTPSConnectionPool(hostfiles.pythonhosted.org, port443): Read timed out.这是最经典的下载超时意思是连接已经建立但数据读取过程等太久了。常见于那种几十MB甚至几百MB的大包下载慢一下子就触发了默认 15 秒的超时限制。ConnectionError: HTTPSConnectionPool ... Max retries exceeded with url这种是根本连不上网络握手阶段就挂了重试次数用尽。还有一类socket.timeout或者SSLError开头的报错也有一定概率是网络链路不稳导致。需要注意的是pip默认的超时时间非常保守单次读取超时只有 15 秒重试次数是 5 次。再加上很多大包的下载是需要持续很久的官方源稍微波动一下很难不触发这些报错。1.3 什么时候最容易被超时卡住根据我踩坑的经验超时高发场景通常有三个。第一个是安装大体积库比如torch、tensorflow、paddlepaddle这类动辄几百 MB 的库下载时间长中途任何一次读取超时都会直接失败。第二个是批量安装也就是一次pip install -r requirements.txt装几十个包整体耗时拉长只要其中一个包卡住整批就挂了。第三个是刚配置好新环境或者换了一台没配过源的机器直接裸用官方源几乎必出问题。反过来说如果你的项目依赖本身不大偶发一次超时删掉重试也可能就过了。但如果同一个包反复超时就不要心存侥幸了直接上下面的正解。2. 一行代码临时切换镜像源立即救急2.1 核心命令和参数拆解标题说的“一行代码”就是这个pip install 包名 -i https://pypi.tuna.tsinghua.edu.cn/simple这一行命令里-i是--index-url的简写意思是“告诉 pip 去哪个仓库找包、下载包”。后面的地址是一个公共镜像源在服务端定期同步官方源的所有包相当于官方 PyPI 的国内加速副本。效果立竿见影之前动不动就超时的包换源之后下载速度通常能提升几倍到几十倍安装过程基本稳定。实际执行时把包名替换成你要装的包就行pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple这是我个人最常用的临时救急命令。它不修改任何全局配置只对当前这一条安装命令生效下次再pip install又会回到官方源。这种“用完即走”的方式适合偶尔装一下包的场景不会污染环境配置。2.2 换源为什么能解决超时要理解换源为何有效关键在于明白“下载这个动作发生在哪条链路上”。官方源服务器在国外传输要走很长的国际链路再加上各种不可控因素丢包率、延迟都高。镜像源则不同它们的服务器位置是国内或者至少在国内有非常成熟的加速线路DNS 解析更快TCP 连接建立更快下载速度也更快。我自己的实测感受是同样一个几十 MB 的包官方源可能下载到一半就报Read timed out换到镜像源之后几秒钟就拉完了有时候快到让你怀疑是不是下载了个空包。所以这一步的本质不是绕过了什么限制而是把“去十万八千里外搬货”改成了“去楼下仓库搬货”问题自然消失。2.3 多镜像源随手切换的备选清单只记一个镜像地址当然最简单但不同地域、不同网络的用户访问同一个镜像站的速度也会有差别。我通常建议多记几个备选一个慢了马上换另一个。常见的几个公共镜像源地址如下镜像源地址高校开源镜像站推荐首选https://pypi.tuna.tsinghua.edu.cn/simple公有云厂商公共镜像https://mirrors.aliyun.com/pypi/simple/另一所高校开源镜像https://mirrors.ustc.edu.cn/pypi/simple/社区维护的 PyPI 镜像https://pypi.doubanio.com/simple/不同镜像源之间包的完整度基本没有差别它们都会定期同步 PyPI 的全部内容包括源码包和二进制包。所以你大可不必担心选了某个源之后会缺这个缺那个。如果一个镜像源超时了就换另一个比如pip install 包名 -i https://mirrors.aliyun.com/pypi/simple/有些镜像源的时间同步策略不同可能存在最长几小时的同步延迟但这对日常使用几乎没有感知。3. 一劳永逸永久配置镜像源3.1 用 pip config 写入全局配置如果你发现自己每隔几天就要pip install一次或者经常在多个环境之间切换那临时加-i总会显得有点啰嗦。更省事的做法是直接把镜像源写进 pip 的全局配置文件让每次安装默认走镜像源。好消息是 pip 自己提供了一个配置命令一行就能搞定pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple执行完之后p i p 会把这个地址写入配置文件。以后你再执行pip install 包名它就会默认去镜像源下载不用再加任何参数。验证一下是否生效可以用pip config list如果输出里能看到global.index-urlhttps://pypi.tuna.tsinghua.edu.cn/simple说明配置成功。3.2 手动编辑配置文件的方式pip config set是简化路径但有时候你想顺便把超时、重试之类的参数一起写进去手动编辑配置文件会更直观。首先找到配置文件位置。Linux 和 macOS 下通常在~/.config/pip/pip.confWindows 下通常在%APPDATA%\pip\pip.ini。如果文件不存在直接新建一个即可。然后用文本编辑器打开写入如下内容[global] index-url https://pypi.tuna.tsinghua.edu.cn/simple timeout 60 retries 3这里timeout是每次读取的超时时间秒retries是失败后的重试次数。这两个参数配合镜像源基本能把超时问题堵死。修改完保存之后新开一个终端窗口再执行 pip 命令就会生效。注意如果系统里设置了环境变量PIP_INDEX_URL那么它的优先级会高于配置文件。也就是说你明明在 pip.conf 里写了镜像源却依然走了其他地址先检查一下环境变量里有没有PIP_INDEX_URL这种“隐形指挥棒”。3.3 永久配置后的常见副作用与处理永久配置完镜像源之后大多数人会遇到一个需要留意的情况某些公司内部会搭自己的私有包源存放一些内部组件。如果全局配置已经固定为公共镜像源安装内部包的时候就会提示找不到。这时候有两个处理办法。第一个是在安装内部包时临时指定内部源覆盖全局配置pip install 内部包名 -i https://内部仓库地址/simple第二个是在配置里追加extra-index-url把内部源写为补充源。这样 pip 会先到主源找不到再到补充源找两种来源都能覆盖[global] index-url https://pypi.tuna.tsinghua.edu.cn/simple extra-index-url https://内部仓库地址/simple这个做法的好处是不用频繁改配置代价是每次安装时 pip 会多请求一个源速度略慢一点点但稳定性更高。另外还有一个容易忽略的点永久配置镜像源只对 Python 生态里的pip install生效如果你想用conda install那又是另一套源配置逻辑别混着找。4. 超时与重试参数不能只会换源4.1 --timeout 与 --retries 参数的实际用法换源能解决绝大多数超时问题但说实话它并不是唯一的手段。有些时候你受限于公司内网策略只能走官方源或者某些特殊包在其他源上恰好没有需要硬着头皮直接从官方源拉。这时候直接调整超时和重试参数也能很大程度上降低失败概率。命令格式如下pip install 包名 --timeout 60 --retries 5--timeout是单次读取数据的超时秒数把它从默认的 15 调大到 60 甚至 120可以让 pip 在面对慢速但不至于断流的网络时更有耐心。--retries是失败重试次数默认 5 次你可以适当调高到 8 次或 10 次增加容错空间。组合起来的一行版本pip install 包名 -i https://pypi.tuna.tsinghua.edu.cn/simple --timeout 60 --retries 5这条命令同时做了两件事把源换成更快的镜像源同时把等待和重试的阈值调到更宽容的水平。对于在弱网环境或大包下载场景下被折磨的人来说这条命令的稳定性远高于裸装。4.2 与 requirements.txt 配合的批量安装优化实际开发中我们很少会一个包一个包手动安装更多时候是拿到一个requirements.txt然后一条命令把项目所有依赖装完。这时候两个问题会同时出现依赖多、总体下载量大任何一个包出问题整批失败另外就是很多人在requirements.txt里只写了包名没有约束版本结果不同环境下装到的版本完全不一样排查问题的时候非常痛苦。批量安装时的推荐命令是pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple如果你希望失败后快速重试而不是从头再来可以考虑加大 timeout 参数pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --timeout 120 --retries 5关于requirements.txt本身我的建议是里面尽量写清楚版本约束比如requests2.31.0而不是只写requests。版本锁定能避免镜像源同步时间差导致的版本不一致问题也更符合可复现部署的原则。4.3 大体积库安装时的组合拳碰到torch、tensorflow、paddlepaddle这类动辄几百 MB 的大块头前面说的“换源 调大超时”还不够我的经验是再补两步。第一步优先从预编译的 wheel 包安装。pip 默认会优先选择当前平台可用的 wheel 包但有些库在某些平台的 wheel 并没有发布到官方源或者镜像同步还没完成pip 就会退回去下载源码包然后当场编译这一步费时费力还特别容易超时。所以安装大库前先确认一下当前 Python 版本是否被库所支持比方说 Python 3.12 刚出来那阵很多库还没有对应的 wheel 包最好装回 3.10 或 3.11 版本省去一堆麻烦。第二步先用pip download把包下载到本地再离线安装。这个方法对下载和安装分离的场景特别友好pip download torch -d ./pkg -i https://pypi.tuna.tsinghua.edu.cn/simple pip install --no-index --find-links./pkg torchpip download会把包包括它的依赖全部拉到本地目录下载任务交给一个专门的过程去跑不会因为某个依赖失败导致安装过程崩溃。等下载完毕再用--no-index告诉 pip “不要联网只从本地找”安装基本秒完成也不会受网络波动影响。5. 仍然超时从日志到缓存到离线安装的彻底排查5.1 从报错信息分辨四个常见故障点换源也做了、超时参数也调了但还是报错那就说明问题不在“远”和“快”这两个维度上而是有其他隐藏故障点。这时候我会先看一眼完整的报错信息判断到底是哪一个环节出了问题。如果报错里有Could not find a version that satisfies the requirement这是“找不到这个包”而非超时。要检查三件事包名有没有打错、Python 版本是否匹配、pip 版本是否过旧。如果报错里有No matching distribution found而且你确认包名没问题很可能是你的 Python 版本太新或太老库本身没有对应轮子。如果报错里有ERROR: Failed building wheel for ...说明包下下来了但编译环节失败了这跟网络已经没关系是本地缺少编译工具链或者依赖头文件。如果报错里有Can not perform a --user install那是权限或环境配置问题跟网络无关。5.2 未下载完全的缓存导致安装失败一个非常隐蔽的坑是pip 在下载包时会把数据写到本地缓存里如果上一次下载因为超时中断留下了一个不完整的缓存下一次安装时 pip 可能会去读取这个残缺的缓存于是又报一遍相同的错误。很多人的第一反应是“再试一次”结果反复试反复失败。遇到这种诡异情况我建议直接清掉缓存再重试pip cache purge如果想绕开缓存下载也可以直接加--no-cache-dir参数pip install 包名 -i 镜像地址 --no-cache-dir这个操作虽然丢失了缓存加速优势但避免了陈旧缓存给安装过程添乱排查问题时非常管用。5.3 非官方源、源码包与编译失败的甄别镜像源绝大多数情况下都靠谱但有一点要注意镜像源只是官方 PyPI 的同步副本它不会替你解决所有系统层面的编译依赖。有些库走通源下载后安装时依然会进入源码编译阶段比如pydantic-core、greenlet这类包含 Rust/C 扩展的库。如果本地没有对应的编译器pip 会报编译错误很多人误以为又是网络问题其实是工具链问题。解决方案有两个方向。第一优先找是否有预编译的 wheel 包wheel 包是二进制格式装的时候不需要编译省时又省事。第二如果确实没有 wheel 包就提前安装编译工具链。Windows 上装 Microsoft C Build ToolsLinux 上确保gcc、python3-dev都装好。5.4 隔离环境与离线安装的兜底方案如果项目部署在一个完全不能联网的机器上比如内网生产环境真正靠谱的方案是离线安装。流程分清楚两步在一台能联网的机器上下载所有依赖到本地目录然后把目录拷贝过去安装。下载依赖pip download -r requirements.txt -d ./offline_pkgs -i https://pypi.tuna.tsinghua.edu.cn/simple在目标机器上离线安装pip install --no-index --find-links./offline_pkgs -r requirements.txt--no-index明确要求 pip 不联网--find-links指定依赖文件所在的目录。这种做法的好处是安装过程完全不受网络波动影响缺点就是依赖目录要跟着项目一起维护升级版本的时候记得重新pip download一次。另外再提一嘴虚拟环境。我强烈建议不要直接在系统级 Python 里装一堆第三方库用venv或者virtualenv隔离每个项目的依赖。倒不是因为超时问题而是不同项目对同一个库的版本要求经常互相冲突虚拟环境是治本之策。创建虚拟环境后前面说的所有换源命令都照常生效没有任何额外成本。6. 我的使用习惯与最后想说的跟超时问题斗争了这么多年我现在的工作流基本固定了新机器到手第一件事就是pip config set global.index-url 镜像地址把默认源改成镜像装大库的时候再用--timeout 60兜底遇到批量部署的场景直接走pip download离线方案不让网络波动成为发布流程的瓶颈。最后再分享一个小技巧如果你经常在多个 Python 版本、多个项目之间切换不妨在项目的 README 里写清楚一行安装命令包含镜像源参数。这样无论是你本人换机器还是同事接手项目都不需要重新踩一遍超时的坑。一个团队如果能统一好 pip 源和依赖锁定文件能省下的不光是时间还有各种来来回回的沟通成本。超时这个问题说大不大但确实是每个 Python 开发者迟早要面对的日常。把它彻底解决掉你会发现自己安装第三方库的速度和信心都上了一个台阶。下次再有人被timeout error折磨得抓狂把这篇文章甩给他比什么都好使。

相关新闻

树链剖分入门:从原理到洛谷P3384模板题实战

树链剖分入门:从原理到洛谷P3384模板题实战

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

2026/10/17 5:52:31 阅读更多 →
Android输入法APK签名验证机制分析与逆向研究思路

Android输入法APK签名验证机制分析与逆向研究思路

前阵子有位朋友问我:逆向一个输入法App,想研究它的签名校验逻辑,该从哪里下手?我没急着甩工具给他,而是先问了一句:你搞清楚Android签名到底在验证什么了吗?这篇文章就以一个输入法APK的签名验证…

2026/10/17 5:52:31 阅读更多 →
会议排期利器:Welsh-Powell图着色算法实战解析

会议排期利器:Welsh-Powell图着色算法实战解析

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

2026/10/17 5:52:31 阅读更多 →

最新新闻

TDA7050 双通道音频功率放大器

TDA7050 双通道音频功率放大器

一、产品概述TDA7050 是一款双通道低电压音频功率放大器集成电路,专为电池供电的便携式音频设备设计。该芯片采用高度集成化架构,内部集成偏置电路、前置放大器、双通道功率输出级及保护电路,无需任何外部元件即可构成完整的音频放大系统。产…

2026/10/17 6:29:56 阅读更多 →
CKEditor 4 Table Selection 插件右键点击清除单元格选择的修复原理与测试详解

CKEditor 4 Table Selection 插件右键点击清除单元格选择的修复原理与测试详解

前端UI组件 【免费下载链接】ckeditor4 The best enterprise-grade WYSIWYG editor. Fully customizable with countless features and plugins. 项目地址: https://gitcode.com/gh_mirrors/ck/ckeditor4 点击查看 免费下载 本篇文章围绕 CKEditor 4 中 tableselec…

2026/10/17 6:29:56 阅读更多 →
EXPLAIN执行计划深度解析:慢SQL排查与索引优化实战指南

EXPLAIN执行计划深度解析:慢SQL排查与索引优化实战指南

一条SQL从300毫秒变成3秒,这种事我遇到过不止一次。遇到这种慢性查询,绝大多数人第一反应都是EXPLAIN一把梭,但真正把EXPLAIN每个字段都看明白的人却不多。绝大多数情况下,我们只看有没有出现ALL、有没有Using filesort&#xff0…

2026/10/17 6:29:56 阅读更多 →
AI大豆病虫害精准防治机器人 QT信创完整项目

AI大豆病虫害精准防治机器人 QT信创完整项目

# AI大豆病虫害精准防治机器人 QT信创完整项目 ## 项目概述 ### 1、信创适配 Qt5.15/Qt6,适配**麒麟、统信UOS、龙芯、飞腾、鲲鹏**全系列国产CPU;依赖OpenCV大豆病斑虫害视觉识别、libmodbus植保机PLC精准喷雾设备通信、SQLite轻量化自主数据库,无闭源商业SDK,完全满足智…

2026/10/17 6:29:56 阅读更多 →
MCreator 基岩版方块 Tint Method 完全指南:让方块像草与树叶一样随生物群系自动着色

MCreator 基岩版方块 Tint Method 完全指南:让方块像草与树叶一样随生物群系自动着色

低代码代码生成桌面应用游戏开发 【免费下载链接】MCreator MCreator is an open-source software used to make Minecraft Java Edition mods, Minecraft Bedrock Edition Add-Ons, resource packs, and data packs using an intuitive easy-to-learn interface or with an in…

2026/10/17 6:29:56 阅读更多 →
claude-code-templates:让AI编码协作更稳定的模板体系

claude-code-templates:让AI编码协作更稳定的模板体系

1. claude-code-templates 这类仓库,解决的其实是“AI 编码协作的出厂设置”如果你已经在终端里用 Claude Code 写过几天代码,一定会有这种感觉:它很强,但“性格”有点飘。今天你让它做代码审查,它给你列二十条小问题&…

2026/10/17 6:28:56 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/16 14:23:36 阅读更多 →