
不想联网还想装 Python 包或者公司内网、隔离机房、设备现场根本没网却要跑数据分析脚本这时候缺了 numpy、pandas、matplotlib 简直寸步难行。我这些年干过不少次这种“断网求生”的活儿踩过不少坑也沉淀下了一套稳定高效的离线安装流程。今天就把这套方法完整拆给你从准备到落地一条龙保证你下次遇到离线环境能心里有底。先说清楚这篇文章是给谁看的你可能是在给生产服务器部署算法可能在给实验室的保密机器配环境也可能只是宿舍网络差到连不上 PyPI。不管哪种只要目标机器连不上外网又需要装常见的科学计算三件套numpy、pandas、matplotlib这篇文章就适合你。我会从最笨的办法讲到最省事的办法连同坑一起说尽量避免你浪费时间。先说个核心结论离线装包的本质是在有网的机器上把要用的包“打包带走”再到没网的机器上“原地解压安装”。听起来简单但难点在于——Python 的包依赖关系往往像蜘蛛网一样乱numpy 装上了pandas 可能还缺依赖pandas 装上了matplotlib 又可能和 numpy 版本冲突。所以真正考验人的不是“下载”这一步而是“理清依赖关系”这一环。1. 离线安装的整体思路与方案选型1.1 几种主流离线安装方式的优劣对比离线装 Python 包我见过不下五种方案说说我用下来的真实感受。第一种是直接拷贝 site-packages 目录。这种办法最粗暴你在有网机器上把整个 Python 环境打包拷到离线机器上解压就能用。好处是快坏处是坑很深——目标机器的 Python 版本、操作系统、CPU 架构必须跟源机器完全一致连系统补丁级别都要接近否则经常出现ImportError: undefined symbol这种神鬼难测的错误。我曾经吃过一次大亏两台 CentOS 7.4 的机器就因为 glibc 小版本不同拷贝过去的 numpy 直接段错误。从那以后不到万不得已我不推荐这种方式。第二种是搭建本地 PyPI 镜像源常见工具是pip2pi、devpi、bandersnatch这类。这种方案适合大团队、长期使用你能把整个 PyPI 或部分包同步到内网服务器然后让离线机器把pip.conf指向内网源体验跟在线安装几乎无差异。但缺点也很明显配置成本高前期得维护一台服务器而且bandersnatch全量同步 PyPI 要占好几个 TB 空间玩不起。第三种是wheel 包直接安装这是我最常用的方式。在有网机器上用pip download把需要的包和所有依赖都下载成.whl文件然后复制到离线机器上用pip install --no-index --find-links/你的目录批量安装。这种方案灵活、可控、可复现而且不依赖目标机器上有网。唯一要注意的是下载时指定好 Python 版本和系统平台避免下错包。第四种是针对单文件脚本的杀手锏——pip install时加--target参数把包装到指定文件夹然后离线机器上把这个文件夹加进sys.path连安装都省了。适合那种只跑一两个脚本的场景省心。1.2 为什么推荐 wheel 路线你可能会问为什么不用源码包.tar.gz直接装答案很残酷numpy、pandas、matplotlib 这三个包都带大量 C 扩展如果走源码安装离线机器上必须装好完整的 C 编译链gcc、python3-dev、fortran 编译器甚至 BLAS/LAPACK 数值库光这些依赖在没有网的情况下就很难凑齐编译过程还可能因为环境差异报各种奇奇怪怪的错。而wheel 属于预编译好的二进制包相当于直接给你做好了的“安装包”里面已经包含了编译好的.so动态库装的时候只需要解压到 site-packages 就行不需要编译器。这就是为什么 wheel 路线在离线场景下碾压源码安装。不过用 wheel 也要多个心眼wheel 文件本身有平台兼容性标签比如文件名里带win_amd64、manylinux2014_x86_64、macosx_10_9_x86_64这样的标识必须跟目标机器的系统匹配才能装。下载的时候选错平台拷贝过去就只能看着ERROR: xxx.whl is not a supported wheel on this platform干瞪眼。关于这个后面第 3 章我会详细说怎么精准匹配。另一个好处是wheel 可以使用--no-deps参数只装指定的包不管依赖这在排查依赖冲突的时候特别有用。源码包装上后你基本无法控制它要装哪些子依赖容易把环境搞乱。2. 准备工作在有网机器上精准下载依赖包既然确定走 wheel 路线需要准备的其实是一个“下载环境”。不用太高级只要满足两点能联网、Python 版本跟目标机器尽可能一致。开发机一般装的是 Python 3.8 或 3.10服务器可能是 3.6 或 3.11所以最好的办法是给目标机器的 Python 版本建一个虚拟环境专门用来下载。2.1 检查目标机器 Python 环境去离线机器上敲几行命令确定关键信息python3 --version pip3 --version python3 -c import platform; print(platform.platform()) python3 -c import struct; print(struct.calcsize(P) * 8)第一行看 Python 版本第二行看 pip 版本第三行看操作系统平台比如Linux-3.10.0-1127.el7.x86_64第四行看是 32 位还是 64 位。这三条信息一一记下来它们会决定你要下载哪种 wheel 文件。注意pip 版本也不能太老。很多老机器上 pip 还是 9.x可能不识别manylinux2014这种新标签导致明明下对了包却装不上。建议在有网上下载阶段顺便把 pip 也升级到最新。如果目标机器完全无网可以考虑离线安装 pip 新版或者下载时选择兼容旧标签的 wheel。2.2 核心下载命令 pip download 的正确用法在有网机器上进到你为目标环境创建的虚拟环境里也可以用--python-version参数指定版本但我建议直接建虚拟环境更保险然后执行mkdir /tmp/pywheels pip download numpy pandas matplotlib -d /tmp/pywheels这条命令会去 PyPI 上查找这三个包并把它们的所有运行依赖一起下载到/tmp/pywheels目录。注意不是只下载这三个它们的依赖比如 pytz、python-dateutil、six、pillow、kiwisolver、contourpy、cycler、fonttools、packaging 等也会一并下载进来。你可能会惊讶在目录里看到二十多个.whl文件别慌这些都是需要的。如果要指定平台可以加参数比如pip download numpy pandas matplotlib \ --only-binary:all: \ --platform manylinux2014_x86_64 \ --python-version 39 \ -d /tmp/pywheels--only-binary:all:是强制只下载 wheel 格式不下载源码包。--platform和--python-version是交叉编译下载时用的如果你跟目标机器的环境不完全一致必须要加如果环境一致就不用加。不过在实际操作里我习惯于不指定平台直接在当前虚拟机里下然后用 2.3 节的方法排查文件这样最不容易错。2.3 wheel 包命名规则看懂文件名再动手这一步非常重要不然后面全是泪。wheel 文件名长这样numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl pandas-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl matplotlib-3.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl拆解一下cp39表示 CPython 3.9你必须确保目标机器 Python 小版本是 3.9.x不是 3.10 或 3.8否则很可能装不上。manylinux_2_17_x86_64.manylinux2014_x86_64表示兼容 Linux 平台x86_64是 64 位。Windows 平台则是win_amd64macOS 是macosx_10_9_x86_64等。有几个容易犯迷糊的点我提一下cp37、cp38、cp39 这串标签指的是 Python 版本的 ABIcp39 的包不能装到 Python 3.8 环境里反过来也不行。所以下载的时候一定要跟目标 Python 版本匹配。manylinux 标签向后兼容。manylinux2014的包可以装到较新的 Linux 系统上但反过来不行。比如manylinux1能装到 RHEL 6 上manylinux2010需要 CentOS 7 以上manylinux2014需要 CentOS 7 或 Ubuntu 18.04。如果你的目标机器是 CentOS 6 这种老古董就得想办法找老版本的包或者源码编译。如果下载目录里出现了.tar.gz文件说明pip download没找到合适的 wheel降级去下了源码包。源码包在离线机器上安装很痛苦所以尽量加--only-binary:all:强制只下 wheel。2.4 检查依赖完整性的实用命令下载完之后不要急着拷贝。先检查一下依赖是否完整方法有两种# 列出所有下载的包 ls -la /tmp/pywheels # 检查依赖关系 pip install --no-index --find-links/tmp/pywheels --dry-run numpy pandas matplotlib--dry-run是 pip 的“演习模式”不会真的安装但会计算并显示依赖关系是否满足。如果输出里出现ERROR: Could not find a version that satisfies the requirement xxx说明缺依赖需要再手动pip download xxx -d /tmp/pywheels补上。这一步值得多花两分钟因为一旦你跑到离线机器上才发现缺依赖就得再跑一趟。我通常还会用 2.5 节的方法做一个依赖白名单记录哪些包对应哪些依赖方便后面排查。2.5 把 wheels 打包带走依赖齐了之后把整个目录打包cd /tmp tar -czvf pywheels.tar.gz pywheels/然后通过 U 盘、scp、内部传输工具等方式拷贝到离线机器上。拷过去之后先解压到某个目录比如/opt/pywheels。记住tar 打包时不要带绝对路径不然解压出来到处都是容易乱。3. 离线机器安装全流程实操3.1 解压和基础检查在离线机器上执行mkdir -p /opt/pywheels tar -xzvf pywheels.tar.gz -C /opt/pywheels cd /opt/pywheels/pywheels ls -la看一下文件是否完整数量跟有网机器上一致。这里有个细节解压的时候尽量不要用 root 用户直接装到系统 Python 里毕竟这是别人维护的机器环境改坏了不好交代。有条件的话建议先创建虚拟环境在虚拟环境里装这样对系统无污染也方便后面删掉重建。创建虚拟环境不需要联网python3 -m venv /opt/myproject_env source /opt/myproject_env/bin/activate如果目标机器上没有venv模块可能需要装python3-venv离线环境就比较麻烦那就只能直接用系统 Python 安装了但建议先备份一下原有的 site-packages。3.2 pip install 离线安装的推荐命令核心命令很简单pip install --no-index --find-links/opt/pywheels/pywheels numpy pandas matplotlib解释一下参数含义--no-index告诉 pip 不要访问 PyPI 索引反正也没网。--find-links/opt/pywheels/pywheels指定从本地目录查找安装包。最后是你要装哪些包的名字。如果一切顺利pip 会输出类似Successfully installed numpy-1.24.3 pandas-2.0.3 matplotlib-3.7.2 ...的结果说明安装完成。如果报错提示缺少某些依赖可以追加包名再装pip install --no-index --find-links/opt/pywheels/pywheels numpy pandas matplotlib pillow pytz python-dateutil也可以直接暴力一点把目录下所有 wheel 都装进去pip install --no-index --find-links/opt/pywheels/pywheels /opt/pywheels/pywheels/*.whl这种“全量安装”方式适合你确信目录里没有不需要的包比如目标机器要装的环境跟下载环境基本一致。好处是简单粗暴坏处是如果目录里有其他项目带进来的无关包会把环境装乱。所以我通常还是指定包名安装更可控。3.3 安装完成后的验证方法光看 “Successfully installed” 还不够得实际跑一下验证。我一般用三行脚本python3 -c import numpy; print(numpy, numpy.__version__) python3 -c import pandas; print(pandas, pandas.__version__) python3 -c import matplotlib; print(matplotlib, matplotlib.__version__)能输出版本号说明导入没问题。但还有一个深坑能 import 不代表能正常工作。特别是 matplotlib它依赖的系统库比如 libGL、libgfortran如果缺失import matplotlib.pyplot可能报错。所以我通常还会画个图测一下python3 -c import matplotlib matplotlib.use(Agg) import matplotlib.pyplot as plt import numpy as np x np.linspace(0, 10, 100) y np.sin(x) plt.plot(x, y) plt.savefig(/tmp/test_plot.png) print(plot saved) matplotlib.use(Agg)是强制使用非交互式后端因为离线服务器上一般没有显示环境不指定后端会报No display name and no $DISPLAY environment variable的错误。保存图片成功才说明 matplotlib 的整个渲染链路没问题。pandas 也可以做个简单 DataFrame 操作验证python3 -c import pandas as pd df pd.DataFrame({a: [1,2,3], b: [4,5,6]}) print(df.describe()) 3.4 Windows 离线安装的差异点如果离线机器是 Windows流程基本一致但有几个差异要留意第一下载 wheel 时要加--platform win_amd64因为 Windows 的 wheel 平台标签跟 Linux 不一样。如果有网机器是 Windows直接用 pip download 自动下win_amd64的包如果有网机器是 Linux要加参数指定pip download numpy pandas matplotlib \ --only-binary:all: \ --platform win_amd64 \ --python-version 310 \ -d D:\pywheels第二Windows 下安装前建议先升级 pipWindows 的 pip 有时版本落后可能无法识别新标签。可以用python -m pip install --upgrade pip离线环境下如果 pip 太老先到官网下载 pip 的 wheel 装上或者干脆在下载阶段用pip download pip -d把新版 pip 一起带过来。第三Windows 的 matplotlib 依赖较多特别是需要pillow、kiwisolver、contourpy这些下载阶段最好用pip download matplotlib -d ...而不是只下 matplotlib 单独文件否则会漏依赖。3.5 特定版本需求的安装案例有时候项目要求固定版本比如 pandas 1.3.5 numpy 1.19.5 是很多老项目的黄金组合。下载时这样指定pip download numpy1.19.5 pandas1.3.5 matplotlib3.4.3 -d /tmp/pywheels注意指定版本时要留意包之间的版本兼容性。numpy 1.19.5 不支持 Python 3.9如果目标机器是 Python 3.9就得用 numpy 1.21.6 或更新版本。pandas 1.3.5 支持 Python 3.7~3.10但需要 numpy1.17.3。建议下载之前先到 PyPI 或包的官方文档查一下版本矩阵省得到时候装好了发现导入报错。还有一个经典坑numpy 2.0 之后改动较大。如果你的项目还在用旧的pandas比如 1.5.x直接装最新 numpy2.x会导致 pandas 报错常见错误是module numpy has no attribute float或者np.NaN不存在。所以离线环境下版本组合一定要谨慎要么全用新的numpy 2.x pandas 2.x要么全用旧的numpy 1.x pandas 1.x别混搭。3.6 进阶把包预装到一个“离线安装包”目录里如果你需要在多台离线机器上重复部署每次拷一堆.whl过去再装也挺麻烦。我常用的一个省事实招是在有网机器上先把所有包装进一个虚拟环境然后打 tar 包带走。python3 -m venv /tmp/offline_env source /tmp/offline_env/bin/activate pip install numpy pandas matplotlib tar -czvf offline_env.tar.gz /tmp/offline_env到了离线机器上解压后直接 source 这个虚拟环境的 activate 脚本就相当于整个 Python 环境都带过来了tar -xzvf offline_env.tar.gz -C /opt source /opt/tmp/offline_env/bin/activate python3 -c import numpy; print(numpy.__version__)不过要注意这个办法对系统库和 Python 版本的一致性要求很高如果离线机器的 glibc 版本太老可能跑不动如果 Python 小版本跟创建虚拟环境的机器不一致也可能 import 报错。所以它更适合当作备用方案而不是首选。我之前有一次从 Ubuntu 20.04 打包到 CentOS 7直接歇菜最终还是回到 wheel 安装这条路。4. 常见离线安装报错与排查心得我整理了这些年离线环境下最常撞见的几个问题和对应的解法别的文章很少写这么细建议收藏。报错现象可能原因解决办法is not a supported wheel on this platformwheel 平台标签不匹配检查目标机器的系统架构、Python 版本重新下载对应 wheelCould not find a version that satisfies the requirement依赖缺失或版本不匹配回到有网机器补下依赖包ImportError: libopenblas.so.0: cannot open shared object filenumpy 依赖的 BLAS 动态库缺失离线机器装 openblas或下载manylinux版本更全的 numpy wheelImportError: libGL.so.1: cannot open shared object filematplotlib 依赖 OpenGL 库缺失离线机器上通过本地源安装 libgl1或先装好系统依赖再装 matplotlibImportError: numpy.core.multiarray failed to importnumpy 编译版本与系统不兼容下载与目标 glibc 匹配的 numpy 旧版或改用源码编译AttributeError: module numpy has no attribute float新 numpy1.20移除了np.float等别名代码里改用np.float64或降到 numpy 1.x 老版本pip install卡住不动pip 在尝试访问网络索引超时确保命令里带--no-index或设置PIP_NO_INDEX1环境变量Symbol not found: _Py_IsFinalizing二进制包与 Python 版本 ABI 不匹配确认 cp 标签与目标 Python 完全一致4.1 平台标签不匹配的详细排查遇到is not a supported wheel on this platform先在离线机器上执行python3 -c import pip._internal.utils.compatibility_tags as t; print(t.get_supported())这会输出一大串当前环境支持的标签比如[(cp39, cp39, manylinux_2_17_x86_64), (cp39, cp39, manylinux2014_x86_64), ...]然后看看你拿过来的 wheel 文件名里是否含有这些标签中的某一个。如果缺失必须去换正确的 wheel。这个命令在 Windows 上也能跑输出是win_amd64相关的标签。我一般在离线机器上装之前都会跑一遍这个然后对比ls列表省得来回折腾。4.2 缺系统动态库的排查方法如果import numpy时报错libxxx.so找不到说明这个 wheel 依赖了系统库。排查方式ldd /opt/myproject_env/lib/python3.9/site-packages/numpy/core/_multiarray_umath.cpython-39-x86_64-linux-gnu.so | grep not foundldd会列出这个.so文件依赖的所有动态库grep not found能快速抓出缺失项。然后去离线机器的系统镜像或本地 yum/apt 源里找对应的库安装。如果没有本地源一个经验是优先下载manylinux1标签的 numpy 旧版因为它的兼容性最好依赖的系统库最少新版本 numpy 用的是manylinux2014标签底层依赖的库相对新老系统上容易缺。4.3 matplotlib 中文乱码问题的离线处理也许你已经成功装好 matplotlib画图时遇到中文显示成方框。在线环境可以pip install一个中文字体包或者直接下载系统字体。离线环境下处理思路不同最好的一招是在有网机器上把中文字体文件如 SimHei.ttf、NotoSansCJK-Bold.ttc下载好拷到离线机器的 matplotlib 字体目录里。找字体目录的方法python3 -c import matplotlib; print(matplotlib.get_data_path() /fonts/ttf)把字体文件拷进去然后删除 matplotlib 的字体缓存目录通常在~/.cache/matplotlib再重新运行脚本。脚本里记得配置import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] # 或你放进去的字体名 plt.rcParams[axes.unicode_minus] False # 解决负号显示为方块的问题这个坑很常见很多离线环境画图没问题但中文字体全挂提前准备好字体文件能省很多事。4.4 多台离线机器批量部署的实用技巧如果你要给十台同样配置的机器装环境有网机器下载一次离线机器每台都装一遍没必要。我建议在第一台装好后把虚拟环境整个打个 tar 包然后分发到其他机器上解压。前提是机器硬件和系统版本一致。如果不一致还是老老实实用 wheel 安装别有侥幸心理。分发之后记得修改虚拟环境的路径配置。虚拟环境里的脚本比如bin/pip、bin/activate会记录创建时的绝对路径如果解压位置变了需要修改pyvenv.cfg文件里的home和include-system-site-packages配置。这个小细节很容易忘忘了就会报No module named pip或者pip无法使用。经验之谈改法vi /opt/myproject_env/pyvenv.cfg # 将 home 指向目标机器的 Python 安装目录4.5 没有 sudo 权限时的离线安装技巧有时候离线机器是公用服务器你没有 root 权限。这时候别慌有两个办法一个是用户级安装pip 加--user参数pip install --user --no-index --find-links/opt/pywheels/pywheels numpy pandas matplotlib这样包会装到~/.local/lib/python3.x/site-packages目录不需要 root。但要注意如果系统 Python 开启了PEP 668externally-managed-environment可能要额外处理。第二个是直接用虚拟环境在你自己用户目录下创建虚拟环境python3 -m venv ~/myenv source ~/myenv/bin/activate虚拟环境天然就不需要 root而且隔离性好强烈推荐。这两招我都实地验证过即使没有 sudo完全可以在用户态把整个数据科学环境跑起来。5. 离线环境的坑边踩边说5.1 版本矩阵不是随便选的离线环境最怕的是版本混搭我建议所有离线项目都养成一个习惯用文本文件记录下安装的每个包的确切版本。有网环境下你可能无所谓但在离线机器上一旦环境出问题想重新装一次的成本是很高的。所以下载阶段我就习惯把版本号全部记下来pip freeze /tmp/pywheels/requirements.txt拷贝到离线机器后以后如果想重建环境直接看着这个文件重新下载。当然如果你是在下载阶段用 pip download这些包的版本信息会保留在 wheel 文件名里但requirements.txt看起来更方便。5.2 有网机器和离线机器的环境差异要谨慎先说个血泪教训。我之前在一台 Ubuntu 20.04 上做了完整的 wheel 下载结果到了客户现场的 CentOS 7.2 机器上装倒是装上了但一import numpy就报undefined symbol: __vdso_clock_gettime。最后发现是目标机器的 glibc 版本太老而新版本 numpy 的预编译包要求 glibc 2.17 才行。CentOS 7.2 默认 glibc 是 2.17理论上没问题但实际就是报错了。后来我把 numpy 降到 1.19.5问题就解决了。所以遇到老系统CentOS 6/7、Ubuntu 16.04 这类宁可用旧版本的大包也不要追求新版。你可以参考这个粗糙的经验法则Python 3.6 配 numpy 1.19.xPython 3.7 配 numpy 1.21.xPython 3.8 配 numpy 1.24.xPython 3.9 配 numpy 1.26.xPython 3.10 可以直接上 numpy 2.x但要注意 pandas 版本兼容。5.3 离线安装时 pip 版本太老怎么办很多离线机器上的 pip 还停留在 9.x 或 18.x它们无法解析新版 wheel 的标签。解决办法是在有网机器上把新版 pip 的 wheel 也一起下回来然后在离线机器上先升级 pippip install --no-index --find-links/opt/pywheels/pywheels pip注意pip 本身的 wheel 文件名也是 cp 标签匹配的但 pip 工具的兼容性比较强一般py3-none-any标签的 pip wheel 可以直接装在任何 Python 3 上。我在离线环境第一步永远是pip install pip --upgrade然后再装其他包能避免很多奇怪问题。5.4 Windows 离线环境特有的“坑前须知”Windows 离线装包有几个独有的麻烦一是Visual C Redistributable。很多新版本 numpy、pandas 的 windows wheel 依赖 VC 运行库离线机器如果没有装安装后 import 会报DLL load failed。解决办法是在有网时下载 VC 运行库安装包比如 vc_redist.x64.exe拷过去装上。二是Windows Defender 可能误杀。这个比较少见但我真遇过一次某个 numpy 的 .pyd 文件被 Defender 当成病毒隔离了导致 import 直接失败。解决办法是把 site-packages 目录加入 Defender 白名单。三是在Windows 下创建虚拟环境用python -m venv C:\myenv C:\myenv\Scripts\activate激活脚本路径跟 Linux 不一样注意别搞混。而且 Windows 下激活虚拟环境后pip 命令是pip.exe而不是pip有时候脚本里写pip会调用到全局的 pip环境装的目录不对最好用python -m pip来执行安装命令这样一定指向当前环境的 pip。6. 进一步扩展离线安装 scikit-learn、scipy 等其他常用包numpy、pandas、matplotlib 装好了很多人接下来还会问那 scipy、scikit-learn 呢它们的离线安装思路完全一样只要在下载阶段把它们一起列进去即可pip download numpy pandas matplotlib scipy scikit-learn -d /tmp/pywheels需要注意scikit-learn 依赖 scipy而 scipy 又依赖 numpy所以依赖链更长。下载阶段一定要让 pip 自动解析依赖不要偷懒只下主包。装的时候同样用pip install --no-index --find-links/opt/pywheels/pywheels numpy pandas matplotlib scipy scikit-learn如果遇到问题排查思路跟上面讲的一模一样。这个可以举一反三任何纯 Python 包和大部分二进制轮子都可以用这套流程离线安装。另外如果你需要在离线环境装openpyxl处理 Excel、requestsHTTP 请求、lxmlXML 解析这类常见业务包方法也是一样的。唯一要留心的是lxml、pydantic 这些有很多系统依赖的包下载时尽量选manylinux标准 wheel别选带musllinux的包除非目标系统是 Alpine Linux。搞错平台标签是最常见的翻车原因。7. 写在最后的实操体会离线安装这事说白了就是“细节决定成败”。你可能觉得无非就是下载拷贝但我见过太多人死在了版本匹配和依赖缺失上。我自己的习惯是每做完一次离线安装就把这次用到的包版本、目标系统信息、踩过的坑记到一个 Markdown 文件里下次再遇到类似环境直接照方抓药效率高很多。最后再分享一个小技巧如果你需要经常做离线部署建议维护一个本地的“wheel 仓库”U 盘或移动硬盘。平时在有网环境就把常用的包按 Python 版本和操作系统分目录存好比如D:\wheelhouse\ ├── py38\ │ ├── win_amd64\ │ ├── manylinux2014_x86_64\ │ └── macosx_10_9_x86_64\ ├── py39\ │ ├── win_amd64\ │ └── manylinux2014_x86_64\ └── py310\ ├── win_amd64\ └── manylinux2014_x86_64\这样到了任何离线环境先从 U 盘里翻对应目录基本能做到十分钟内完成 numpy、pandas、matplotlib 的安装。这套方法我用了好几年帮我在无数个没网的机房里撑过了场子今天全部分享给你希望能帮你少走点弯路。