☰
离线安装Python包实战:numpy、pandas、matplotlib断网环境一条龙搞定
2026/10/5 6:24:25 网站建设 项目流程

不想联网还想装 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_amd64,macOS 是macosx_10_9_x86_64等。

有几个容易犯迷糊的点我提一下:

  • cp37、cp38、cp39 这串标签指的是 Python 版本的 ABI,cp39 的包不能装到 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 下安装前建议先升级 pip,Windows 的 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 numpy==1.19.5 pandas==1.3.5 matplotlib==3.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,但需要 numpy>=1.17.3。建议下载之前先到 PyPI 或包的官方文档查一下版本矩阵,省得到时候装好了发现导入报错。

还有一个经典坑:numpy 2.0 之后改动较大。如果你的项目还在用旧的pandas(比如 1.5.x),直接装最新 numpy(2.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 版本,重新下载对应 wheel
Could not find a version that satisfies the requirement依赖缺失或版本不匹配回到有网机器,补下依赖包
ImportError: libopenblas.so.0: cannot open shared object filenumpy 依赖的 BLAS 动态库缺失离线机器装 openblas,或下载manylinux版本更全的 numpy wheel
ImportError: libGL.so.1: cannot open shared object filematplotlib 依赖 OpenGL 库缺失离线机器上通过本地源安装 libgl1,或先装好系统依赖再装 matplotlib
ImportError: numpy.core.multiarray failed to importnumpy 编译版本与系统不兼容下载与目标 glibc 匹配的 numpy 旧版,或改用源码编译
AttributeError: module 'numpy' has no attribute 'float'新 numpy(1.20+)移除了np.float等别名代码里改用np.float64,或降到 numpy 1.x 老版本
pip install卡住不动pip 在尝试访问网络索引超时确保命令里带--no-index,或设置PIP_NO_INDEX=1环境变量
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 found"

ldd会列出这个.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 668(externally-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.x,Python 3.7 配 numpy 1.21.x,Python 3.8 配 numpy 1.24.x,Python 3.9 配 numpy 1.26.x,Python 3.10+ 可以直接上 numpy 2.x(但要注意 pandas 版本兼容)。

5.3 离线安装时 pip 版本太老怎么办

很多离线机器上的 pip 还停留在 9.x 或 18.x,它们无法解析新版 wheel 的标签。解决办法是在有网机器上把新版 pip 的 wheel 也一起下回来,然后在离线机器上先升级 pip:

pip 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)、requests(HTTP 请求)、lxml(XML 解析)这类常见业务包,方法也是一样的。唯一要留心的是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 的安装。这套方法我用了好几年,帮我在无数个没网的机房里撑过了场子,今天全部分享给你,希望能帮你少走点弯路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询