尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
离线环境安装PyInstaller全攻略:依赖闭包与版本匹配实战
1. 为什么要在离线环境里折腾 PyInstaller先说清楚一件事PyInstaller 本身不是什么冷门工具把 Python 脚本打包成单文件可执行程序这活儿大部分人都干过。但真正让人头疼的场景是目标机器压根连不上外网——内网服务器、隔离机房的构建机、客户现场那台连 USB 口都封了的工控机这时候你pip install pyinstaller敲下去等来的只有一行红字超时。离线安装 PyInstaller 这个事核心解决的就是“打包环境与互联网物理隔离”这个矛盾。我接触这类需求最早是给一个做数据采集的团队做交付支持。他们的部署环境在内网Python 版本是 3.8机器上连 pip 源都指向一个内部镜像而那个镜像里偏偏没有 PyInstaller。当时第一反应是“拷个 whl 过去不就行了”结果一拷就发现事情没那么简单PyInstaller 不是单个包它有一串依赖而且不同 Python 版本、不同操作系统对应的 wheel 文件还不一样装错一个版本后面打包出来的 exe 要么缺 DLL要么直接闪退。所以这篇内容想讲透的是离线安装 PyInstaller 的完整方法论从依赖关系梳理、wheel 包的正确挑选、离线安装的顺序控制到装完之后怎么验证、打包时怎么避免踩坑。适合两类人看——一类是被隔离环境逼得没辙、必须手工搬运依赖的运维或交付工程师另一类是想搞清楚“pip 装一个包背后到底发生了什么”的 Python 开发者。哪怕你平时联网装包一路顺畅把这套流程走一遍对依赖管理的理解也会上一个台阶。我先把结论摆前面离线安装 PyInstaller 的难点从来不在 PyInstaller 本身而在于依赖闭包的完整性和版本匹配。只要把这两点拿捏住剩下的就是几条命令的事。2. 离线安装的整体思路与方案选型2.1 先搞清楚 PyInstaller 到底依赖了什么很多人以为pip install pyinstaller就是装一个包实际上 pip 在背后解析了一棵依赖树。PyInstaller 的核心依赖大致分这么几层直接依赖包括altgraph、pyinstaller-hooks-contrib、setuptools在部分版本里还会牵扯到pefileWindows 平台解析 PE 文件用、pywin32-ctypesWindows 平台调用系统 API 用、macholibmacOS 平台解析 Mach-O 用。这些依赖有的是全平台通用有的是按操作系统条件加载的。这就带来第一个关键认知你在联网机器上pip download下来的包未必和目标机器的平台匹配。比如你在 Windows 上打包下载时如果不指定平台pip 默认下的是当前平台的 wheel但如果你是在 Linux 构建机上给 Windows 目标机准备离线包就必须显式指定--platform否则下下来的pywin32-ctypes是 Linux 版本拷到 Windows 上根本装不上。我一般会先在一台和目标环境尽可能一致的机器上跑一遍pip download pyinstaller -d ./offline_pkgs让 pip 自己把依赖树解析完整。这一步的意图很明确让 pip 充当依赖解析器而不是靠人脑去记依赖清单。人脑记漏一个altgraph后面安装就会报“No matching distribution found”然后你还得回头补来回折腾。2.2 三种离线方案怎么选离线安装 PyInstaller实操上有三条路各有适用场景我做个对照表方便你判断方案做法优点缺点适用场景方案一wheel 包搬运联网机pip download拷贝 whl 到离线机pip install --no-index干净、可控、不污染环境需处理平台和版本匹配绝大多数场景首选方案二整包目录拷贝联网机pip install --target到目录整个目录拷过去简单粗暴容易带进无关文件路径处理麻烦临时应急、单次使用方案三离线源搭建内网搭一个简易 pip 源如 devpi 或本地目录源一次搭建长期复用搭建成本高团队长期有离线装包需求我个人的偏好是方案一为主、方案三为辅。单次交付用方案一几分钟搞定如果是团队常态化的离线构建值得花半天把方案三搭起来后面所有包都能走内部源省得每次手工搬。方案二我基本不用因为--target装出来的目录结构在跨机器拷贝时sys.path的处理很容易出幺蛾子尤其是涉及带 C 扩展的包时动态库路径问题能让人抓狂。这里补一句方案一的关键命令先给个印象后面第 3 章会展开# 在联网机器上下载 pyinstaller 及其全部依赖 pip download pyinstaller -d ./offline_pkgs-d指定下载目录pip 会自动把依赖树里所有包都下到这个目录。注意如果你的联网机和离线机 Python 版本不一致务必加--python-version参数否则下下来的 wheel 标签对不上。2.3 为什么强调“版本锁定”而不是“装最新”离线环境最怕的就是“这次能装、下次装不上”。因为离线机没有网络pip 无法在线解析版本你拷过去什么版本就是什么版本。如果这次拷的是 PyInstaller 6.x下次别人拷了个 5.x 的依赖组合两次打包出来的产物行为可能不一致排查起来极其痛苦。所以我的做法是在联网机上先pip freeze出一份完整的依赖清单连同 wheel 包一起归档。清单里记录每个包的精确版本号离线安装时严格按清单来。这样即便半年后重新构建只要 wheel 包还在装出来的环境就是可复现的。这个习惯看起来啰嗦但在需要长期维护的交付项目里能省掉大量“为什么上次好好的这次不行”的扯皮。3. 核心细节解析与实操要点3.1 wheel 包命名规则看懂文件名就不会装错离线安装翻车十有八九是 wheel 包选错了。wheel 文件名不是随便起的它遵循一套严格的命名规范格式大致是{distribution}-{version}(-{build tag})?-{python tag}-{abi tag}-{platform tag}.whl拿一个真实存在的文件名举例pyinstaller-6.3.0-py3-none-win_amd64.whl。拆开看pyinstaller是包名6.3.0是版本py3表示适配 Python 3none表示不依赖特定 ABIwin_amd64表示 64 位 Windows 平台。这几个标签必须和目标环境对得上否则 pip 会直接拒绝安装报“is not a supported wheel on this platform”。最容易出错的是platform tag。win_amd64是 64 位 Windowswin32是 32 位 Windowsmanylinux2014_x86_64是 Linuxmacosx_10_9_x86_64是 macOS。如果你在 Linux 上下载给 Windows 用必须加--platform win_amd64同时加--only-binary:all:强制只下二进制包否则 pip 可能给你下个源码包.tar.gz源码包到离线机上还得编译而离线机往往连编译器都没装。提示--only-binary:all:这个参数在跨平台下载时几乎是必加的它能避免 pip 退而求其次去下源码分发包。源码包在离线环境里安装需要目标机具备完整的编译工具链这在隔离环境里基本不现实。还有一个坑是 Python 版本标签。py3是通用的但有些包会标cp38、cp39这种表示只适配 CPython 3.8、3.9。如果你目标机是 3.8下载时用了--python-version 3.11下下来的包标签是cp311装到 3.8 上直接报错。所以--python-version一定要和目标机严格一致连小版本都别马虎。3.2 依赖闭包完整性漏一个包就前功尽弃前面说过PyInstaller 的依赖不是单个包。我实测过几个版本依赖清单大致如下不同版本略有差异以实际pip download结果为准altgraph图结构处理PyInstaller 分析模块依赖关系时用pyinstaller-hooks-contrib钩子集合处理各种第三方库的打包适配setuptools打包基础设施部分版本需要pefileWindows 平台解析 PE 格式pywin32-ctypesWindows 平台调用系统接口macholibmacOS 平台解析二进制格式这里的关键操作是不要手工列清单去下载让 pip 自己解析。因为依赖关系是动态的PyInstaller 升级一个版本依赖可能就变了。手工清单一旦过期就会漏包。正确姿势是联网机上直接pip download pyinstallerpip 会把整棵依赖树都拉下来。但这里有个细节要注意pip download默认只下载当前平台、当前 Python 版本的包。如果你要跨平台准备得把平台和版本参数都带上。我常用的组合是这样pip download pyinstaller \ --dest ./offline_pkgs \ --platform win_amd64 \ --python-version 3.8 \ --only-binary:all:这条命令的意思是给 64 位 Windows、Python 3.8 的环境准备离线包。--dest是下载目录--platform指定目标平台--python-version指定目标 Python 版本--only-binary:all:强制只下二进制包。四个参数缺一不可少一个都可能下错。注意--platform和--python-version这两个参数pip 在某些版本里要求必须配合--only-binary:all:或--no-deps使用否则会报错。这是 pip 的设计约束不是 bug照着加就行。3.3 离线安装的顺序控制先依赖后主体wheel 包都拷到离线机之后安装顺序其实有讲究。虽然 pip 在--no-index模式下会尝试解析本地目录里的依赖但如果你直接pip install pyinstaller-xxx.whlpip 可能会因为找不到依赖而失败——因为它默认还是想去网上找依赖只是被--no-index拦住了。正确的做法是两种一是用--find-links指向本地目录让 pip 在本地找依赖pip install --no-index --find-links./offline_pkgs pyinstaller--no-index表示完全禁用在线索引--find-links告诉 pip 去哪个本地目录找包。这样 pip 会在本地目录里解析依赖树按需安装顺序由 pip 自己控制比手工排序靠谱得多。二是如果 pip 版本较老、--find-links解析有问题就手工按依赖顺序装先装altgraph、setuptools这些底层依赖再装pyinstaller-hooks-contrib最后装pyinstaller主体。手工顺序的原则是“被依赖的先装”pyinstaller依赖别人所以它最后装。我一般优先用第一种因为省心。但有个前提本地目录里的 wheel 包必须齐全缺一个 pip 就会报错。所以装之前先ls ./offline_pkgs数一下包的数量和联网机上pip download输出的包数量对一遍数量对上了再动手。3.4 虚拟环境隔离别把系统 Python 搞脏离线机上装包我强烈建议先建一个虚拟环境。原因很简单离线机往往是生产机或交付机系统 Python 里可能已经装了一堆业务依赖你直接往里装 PyInstaller万一版本冲突把原有环境搞坏了恢复起来很麻烦。建虚拟环境的命令很常规python -m venv ./pyinstaller_env # Windows 激活 pyinstaller_env\Scripts\activate # Linux/macOS 激活 source ./pyinstaller_env/bin/activate激活之后pip install装的所有包都隔离在这个环境里打包时用这个环境的 Python 执行 PyInstaller产物干净出问题也好回滚——大不了删掉整个环境目录重来。这里有个实操心得虚拟环境的 Python 版本必须和目标运行环境一致。比如你的程序最终要在 Python 3.8 上跑那虚拟环境就得用 3.8 建。因为 PyInstaller 打包时会嵌入 Python 解释器版本不一致打出来的程序在目标机上可能因为缺少对应版本的运行时库而启动失败。这个坑我踩过一次当时用 3.10 环境打包目标机是 3.8exe 双击直接闪退查了半天才发现是解释器版本错配。4. 完整实操流程与关键环节实现4.1 联网机上的准备工作下载与归档整个流程从联网机开始。第一步是确认目标环境信息我一般会列一个清单目标操作系统Windows/Linux/macOS、位数32/64、Python 精确版本如 3.8.10、是否需要特定架构x86_64/arm64。这些信息决定了后面所有下载参数。信息确认后建一个干净的下载目录执行下载命令。以 Windows 64 位、Python 3.8 为例mkdir offline_pkgs pip download pyinstaller \ --dest ./offline_pkgs \ --platform win_amd64 \ --python-version 3.8 \ --only-binary:all:执行完offline_pkgs目录里应该有一批.whl文件。我习惯再跑一条命令生成依赖清单方便归档和核对pip freeze requirements_offline.txt注意pip freeze输出的是当前环境所有包不是只针对 PyInstaller 的。更精确的做法是在一个干净虚拟环境里只装 PyInstaller再 freeze。不过对于离线安装来说wheel 包本身已经包含了版本信息清单主要是给人看的方便日后追溯。下载完成后把整个offline_pkgs目录打包zip 或 tar连同requirements_offline.txt一起拷到离线机。拷贝方式看环境限制U 盘、内网共享、刻盘都行这里不展开。提示拷贝前建议对 wheel 包做一次完整性校验比如算个 MD5 或 SHA256 存成文本一起带过去。离线机装之前核对一遍能避免传输过程中文件损坏导致的“装到一半报错”这种低级但烦人的问题。4.2 离线机上的安装从解压到验证离线机上先把压缩包解压到某个目录比如D:\offline_pkgs。然后建虚拟环境、激活、安装三步走python -m venv ./pyinstaller_env pyinstaller_env\Scripts\activate pip install --no-index --find-linksD:\offline_pkgs pyinstaller如果一切顺利最后会看到Successfully installed ...的输出列出装上的所有包。这时候别急着打包先验证一下 PyInstaller 能不能正常跑pyinstaller --version能打印出版本号说明安装成功。再进一步跑一个最小化的打包测试写个hello.py内容就一行print(hello)然后执行pyinstaller --onefile hello.py--onefile表示打成单文件。执行完在dist目录下会生成hello.exeWindows或helloLinux。双击或命令行运行一下能输出hello就说明整条链路通了。这一步的意图是尽早暴露问题。很多人装完 PyInstaller 就直接上真实项目打包结果报一堆错分不清是安装问题还是项目依赖问题。先用最小样例验证工具链本身能把问题范围缩小到“安装”这一层排查效率高得多。4.3 打包真实项目时的依赖处理最小样例通过后轮到真实项目。这里有个关键点PyInstaller 只负责打包不负责帮你装项目依赖。你的项目import了requests、numpy这些第三方库这些库也得在离线环境里装好否则打包时 PyInstaller 分析 import 会失败或者打出来的程序运行时缺模块。所以离线安装 PyInstaller 往往不是孤立任务而是“离线安装整个项目依赖”的一部分。做法是一样的联网机上pip download项目所有依赖拷到离线机装。PyInstaller 只是其中一员。打包命令我常用的组合是pyinstaller --onefile --clean --noconfirm main.py--clean清理上次构建的缓存--noconfirm覆盖输出目录不询问。这两个参数在反复调试时很有用能避免缓存导致的“改了代码但打出来的还是旧行为”这种诡异现象。如果项目有数据文件、配置文件需要一起打包用--add-datapyinstaller --onefile --add-data config;config main.pyWindows 上分隔符是分号Linux/macOS 上是冒号这个差异要注意跨平台脚本里最好用变量区分。4.4 参数选择背后的计算逻辑有人问过--onefile和默认的目录模式--onedir怎么选。这不是拍脑袋决定的得看场景。--onefile打出来是单个可执行文件分发方便但启动时要把内部资源解压到临时目录启动速度慢一些而且某些杀毒软件会对“自解压”行为敏感可能误报。--onedir打出来是一个目录里面有一堆文件分发麻烦点但启动快、误报少。我的判断标准是交付给非技术用户、追求“双击即用”的用--onefile内部工具、启动性能敏感的用--onedir。这个取舍没有绝对对错取决于你的分发场景。再比如--hidden-import参数用于处理 PyInstaller 静态分析没识别到的动态导入。什么时候需要加当你的代码里有importlib.import_module(xxx)这种字符串形式的动态导入时PyInstaller 分析不出来运行时就会报ModuleNotFoundError。解决办法就是显式--hidden-import xxx。这个参数加多了会让包变大所以只加真正需要的别一股脑全加。5. 常见问题与排查技巧实录5.1 安装阶段的典型报错与对策离线安装阶段的问题相对集中我整理了一张速查表报错信息原因解决办法No matching distribution found for pyinstaller本地目录里没有匹配当前平台/版本的 wheel检查 wheel 文件名标签重新下载对应平台版本is not a supported wheel on this platformwheel 的 platform tag 与目标机不符用--platform重新下载正确平台包Could not find a version that satisfies the requirement altgraph依赖包缺失确认pip download时依赖树完整补齐缺失包ERROR: Failed building wheel for xxx下到了源码包离线机无编译环境加--only-binary:all:重新下载二进制包第一类报错最常见本质是“包不对”。排查方法很直接看报错里提到的包名去offline_pkgs目录里ls一下看有没有对应的 whl再看文件名里的平台标签对不对。对不上就回联网机重下。第二类报错是平台标签错配前面 3.1 节讲过命名规则对照着看就行。有个小技巧在离线机上跑python -c import pip; print(pip.pep425tags.get_supported())老版本 pip或者python -c from pip._internal.utils.compatibility_tags import get_supported; print(get_supported())新版本能打印出当前环境支持的所有标签拿这个和 wheel 文件名比对一目了然。5.2 打包运行阶段的坑装好了、打包也成功了但运行时报错这类问题更隐蔽。我遇到最多的三种第一种是ModuleNotFoundError运行时缺模块。原因通常是动态导入没被识别或者某个依赖包在打包时被漏掉了。排查方法是看报错里的模块名如果是第三方库加--hidden-import如果是项目内部模块检查sys.path和相对导入写法。第二种是Failed to execute script程序启动就崩。这个报错信息很笼统真正原因藏在细节里。我的排查套路是先用--onedir模式打包不用--onefile然后直接在命令行运行生成的 exe这样能看到完整的 traceback比--onefile模式下“一闪而过”强得多。定位到具体错误行再针对性解决。第三种是杀毒软件误报。--onefile打出来的 exe 因为自解压行为容易被某些安全软件标记。解决办法要么换--onedir要么给 exe 做数字签名如果有证书要么在交付文档里说明让用户加白名单。这个不是技术问题是交付沟通问题提前和用户说清楚能省很多事。注意--onefile模式下程序启动时会解压到系统临时目录如果目标机的临时目录权限受限比如某些受控环境解压会失败程序直接起不来。这种场景必须用--onedir把依赖文件放在程序同目录下绕开临时目录权限问题。5.3 独家避坑心得分享几个文档里不常写、但实操中很管用的经验。第一wheel 包目录别混入不同版本的包。有次我图省事把两次下载的包放同一个目录结果里面同时有pyinstaller-5.x和6.x两个版本pip 安装时选了哪个全看它心情导致两次构建产物不一致。后来我养成习惯每次下载用带日期或版本号的新目录比如offline_pkgs_20240115绝不混用。第二离线机的 pip 版本别太老。老版本 pip 对--find-links的依赖解析能力弱可能明明包都在本地它就是找不到。装之前先pip --version看一眼如果低于 20.x建议先用离线方式把 pip 本身升级一下pip 的 wheel 也在下载目录里备一份。第三打包前清一遍build和dist目录。PyInstaller 有缓存机制有时候改了代码但缓存没更新打出来的还是旧逻辑。--clean参数能清缓存但保险起见我习惯手动把build、dist、*.spec都删了重来尤其是排查诡异问题时干净构建能排除一大半干扰因素。第四记录目标机的 Python 完整版本号。3.8和3.8.10在 wheel 标签上可能没区别但某些 C 扩展包对补丁版本敏感。交付前在目标机跑python -V记下完整版本下载时--python-version填完整版本号能避免一些边缘的兼容问题。6. 跨平台离线安装的差异处理6.1 Windows 与 Linux 的关键区别跨平台离线安装差异主要集中在依赖包和打包产物上。Windows 平台多出pefile、pywin32-ctypes这两个依赖Linux 平台则不需要反过来Linux 上打包要注意 glibc 版本兼容性——在高版本 glibc 的机器上打的包拿到低版本 glibc 的目标机上可能跑不起来报GLIBC_2.xx not found。应对 glibc 问题的办法是在尽可能低版本的目标环境上打包或者用容器固定构建环境。离线场景下没法拉容器镜像那就退而求其次在目标机同款系统上做构建。这也是为什么我强调虚拟环境的 Python 版本要和目标机一致——系统层面的兼容性PyInstaller 管不了。Linux 上还有个细节打出来的可执行文件默认没有执行权限拷到目标机后要chmod x。这个不算坑但交付时容易忘写进交付文档里。6.2 macOS 的特殊性macOS 的离线安装相对小众但逻辑一样。需要注意的是 macOS 有 Intel 和 Apple Silicon 两种架构wheel 标签分别是macosx_x86_64和macosx_arm64下载时--platform要选对。另外 macOS 的 Gatekeeper 机制会对未签名的可执行文件拦截交付时要么签名要么指导用户手动放行。我处理 macOS 离线包时习惯把两种架构的 wheel 都下载下来分别建目录存放避免混淆。虽然体积翻倍但省去了“装错了再重下”的来回。6.3 一个通用的跨平台检查清单不管哪个平台离线安装前过一遍这个清单能挡掉大部分问题目标机操作系统和位数确认了吗目标机 Python 完整版本号记下了吗下载命令的--platform、--python-version填对了吗--only-binary:all:加了吗wheel 包数量与依赖树对得上吗虚拟环境建好了吗最小样例打包验证过了吗这个清单看着琐碎但每一条都对应一个真实踩过的坑。我现在做离线交付基本是照着清单打勾打完勾再动手返工率能降一大截。7. 把离线安装做成可复用的流程单次离线安装按上面的步骤走一遍就完事了。但如果一个团队长期有离线构建需求每次都手工搬包、手工核对效率太低且容易出错。我的建议是把这套流程脚本化。具体做法是写两个脚本一个在联网机跑负责按参数下载 wheel 并生成清单一个在离线机跑负责建环境、装包、跑验证。联网机脚本的核心就是前面那条pip download命令参数从配置文件读离线机脚本把venv创建、pip install --no-index、pyinstaller --version串起来。两个脚本加上 wheel 包目录就是一个自包含的离线安装包。这套东西搭一次后面所有离线交付都能复用新同事接手也不用重新摸索。我所在的团队就是这么干的一个offline_bundle目录里面脚本、wheel、清单、README 齐全交付时整个目录拷过去照着 README 跑两条命令十分钟内环境就起来了。最后分享一个我个人的习惯每次离线安装完成后把实际装上的包版本pip freeze一份存到项目归档里。下次再给同类环境做离线包时直接拿这份 freeze 清单当基准能保证多次交付的环境完全一致。这个习惯在需要长期维护多个交付版本的项目里价值特别明显——出问题时能精确复现当时的依赖状态而不是靠记忆去猜“当时装的是哪个版本”。这套流程走下来离线安装 PyInstaller 就从一件“看运气”的事变成了一件“照着做就行”的事。核心还是那句话依赖闭包完整、版本标签匹配剩下的都是执行细节。
RELATED

相关推荐

Assimp 5.2.0 + VS2019 静态库集成指南

Assimp 5.2.0 + VS2019 静态库集成指南

简介:本资源为适用于Visual Studio 2019 x64平台的预编译Assimp三维模型导入库,面向游戏开发、计算机图形学学习者及C三维应用开发者,解决多格式3D模型(如OBJ、FBX、3DS、COLLADA等)快速加载与结构化处理难题。压缩包共…

📅 2026/11/2 9:48:49
使用Astro构建高性能静态博客的完整指南

使用Astro构建高性能静态博客的完整指南

1. 为什么选择Astro搭建静态博客? 三年前我第一次尝试用WordPress搭建个人博客时,服务器月费、数据库维护和安全更新让我疲于奔命。直到发现Astro这个静态站点生成器,我的技术博客才真正找到了归宿。Astro最吸引我的是它"内容优先"…

📅 2026/11/2 9:48:49
EdgeBus技术:物联网边缘计算的低成本协议转换方案

EdgeBus技术:物联网边缘计算的低成本协议转换方案

1. EdgeBus技术定位与核心价值在物联网边缘计算领域,传感器数据与LoRaWAN网络的高效对接一直存在成本与复杂度的双重挑战。传统方案通常需要网关设备进行协议转换,不仅增加了硬件成本(单个网关设备价格通常在2000-5000元区间)&…

📅 2026/11/2 9:43:47
MORE NEWS

更多资讯

📰

C++ PCL kdtree

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

📰

C++字体库开发之EM长度单位转换九

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

📰

Kornia核心模块深度解析:几何变换与图像处理

Kornia核心模块深度解析:几何变换与图像处理 【免费下载链接】kornia 🐍 Geometric Computer Vision Library for Spatial AI 项目地址: https://gitcode.com/GitHub_Trending/ko/kornia Kornia是一个基于PyTorch的可微分计算机视觉库&#xff0c…

📰

C++智能指针配合STL模板类

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

📰

C++字体库开发之字体回退十

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

📰

基于ESP8266与MQTT的智能家居远程控制模块设计方案

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

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬