ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

离线断网环境下安装Python第三方包:numpy/pandas/matplotlib完整方案

离线断网环境下安装Python第三方包:numpy/pandas/matplotlib完整方案 离线断网环境下装Python第三方包这件事我这些年碰到过不下十回。你想想看公司在内网开发或者实验室的机器没有外网权限偏偏数据分析离不开numpy、pandas、matplotlib这几个库。第一次遇到的时候我也是愣了半天pip install直接超时失败连报错都显得很无助。后来把整条流程理顺了才发现离线装包这件事的核心就一句话把该准备的包提前准备好用对命令一次就能成功。这篇文章就专门讲清楚离线断网情况下安装numpy、pandas、matplotlib等常用第三方包的完整方案。适合刚入门Python、被困在内网环境里的新手也适合需要在隔离环境里帮同事搭建数据科学基础环境的运维或开发同学。不扯虚的我直接把实际操作步骤、版本选择逻辑和踩过的坑全部写出来。1. 离线安装的整体思路先想清楚你要面对什么1.1 为什么断网环境下安装第三方库这么让人头疼先搞清楚pip在线安装的工作原理。你执行pip install numpy的时候pip会默认去官方PyPI仓库查这个包然后把对应你当前Python版本和操作系统的wheel文件下载下来再执行安装动作。整个过程看着简单但涉及两次联网一次是查询索引一次是下载文件。断网环境下这两步全部走不通所以直接敲pip install numpy必然失败。更隐蔽的问题是依赖链。哪怕是装一个numpy它本身可能没有太多依赖但pandas和matplotlib这两个库几乎没有一个是“光杆司令”。以pandas为例它依赖numpy、python-dateutil、pytz在某些新版本里还会拉起tzdatamatplotlib依赖的包更多contourpy、cycler、fonttools、kiwisolver、numpy、packaging、pillow、pyparsing、python-dateutil一堆。你以为你只需要拷一个pandas.whl过去结果pip install的时候它发现缺少python-dateutil又去连网下载于是又失败了。所以离线安装的难点不在于“怎么把包导进去”而在于“怎么把整条依赖链一次性打包齐全”。想清楚这一点后面所有操作就有了主线。1.2 可行的两条路子手动下载wheel与pip download批量打包针对离线安装主要有两种做法。第一种是手动去PyPI网站或者镜像站把需要的wheel文件一个一个下载下来然后用U盘、内网共享目录或者其他方式拷到目标机器再用pip install xxx.whl逐个安装。这种办法适合只装一两个包、依赖很少的情况因为人工核对依赖关系很费神漏一个就翻车。如果只是给一台干净的机器装numpy、pandas、matplotlib手动下载要至少找十几个文件还容易因为版本不匹配踩坑。第二种是提前在一台联网机器上用pip download命令把所有需要的包连依赖一起下载到本地目录再把这个目录整体拷到断网机器上用pip install --no-index --find-links目录完成批量安装。这种方式是我目前强烈推荐的原因很简单它让联网机器帮你把“哪些包需要、什么版本匹配”这件事自动梳理好了你只需要保证联网机器和目标机器的Python版本、操作系统一致就行。我后面讲的具体操作主要围绕第二条路展开但也会把第一条路的关键点说清楚毕竟有些极端环境连pip都是旧的或者网速慢到只能一个个下载。2. 动手之前先把版本匹配搞明白2.1 确认目标机的Python版本和系统架构离线安装最怕的就是版本错位。你辛辛苦苦拷过去的whl文件放到目标机器上一安装直接报not a supported wheel on this platform那种感觉真的很崩溃。所以动手之前第一件事是去目标机器上确认两个信息Python版本和操作系统架构。在目标机器打开命令行Windows下是cmd或PowerShellLinux下是终端分别执行下面两段命令# 查看Python版本 python --version # 查看系统架构 # Windows下 echo %PROCESSOR_ARCHITECTURE% # Linux下 uname -mPython版本会输出类似Python 3.10.8这样的信息重点看大版本号也就是3.10、3.9、3.8这些。系统架构方面Windows下通常显示AMD64对应64位系统Linux下uname -m返回x86_64就代表64位返回aarch64就代表ARM架构。这两个参数决定了你后面要找什么样的wheel文件。这里要特别提醒一句Python版本只看大版本还不够规范但实际选择包时主要看主版本号加次版本号比如3.10.x都适用cp310的包。如果机器上同时装了多个Python版本务必确认你用的那个pip到底属于哪个Python最稳妥的方式是用python -m pip来执行所有pip命令后面我会反复提到这个习惯。2.2 whl包命名规则怎么看想知道一个wheel包能不能用不是看文件大小而是看文件名。PyPI上下载到的numpy安装包通常长这样numpy-1.24.3-cp310-cp310-win_amd64.whl这段文件名拆开来看包含几个关键部分numpy是包名1.24.3是版本号cp310表示这个包适配CPython 3.10后面第二个cp310表示ABI兼容版本win_amd64表示Windows 64位平台。如果你在Linux上下载常见的后缀是manylinux_2_17_x86_64或者manylinux2014_x86_64这些标签说明它可以在满足glibc版本要求的Linux x86_64系统上运行。理解了命名规则你就知道为什么网上有人下载的包在自己机器上装不了。比如你的环境是Python 3.8但下载的whl文件名里写的是cp311那不管你怎么安装pip直接拒绝。版本匹配是离线安装里最需要细心的一环。2.3 主流版本对应关系速查为了省得大家一个个去试我整理了一份比较常见的对应关系覆盖Python 3.7到3.11这几个依然活跃在各类内网环境里的版本Python版本numpy可用版本示例pandas可用版本示例matplotlib可用版本示例Python 3.7numpy 1.21.x及以下pandas 1.3.x及以下matplotlib 3.5.x及以下Python 3.8numpy 1.22.x ~ 1.24.xpandas 1.5.x ~ 2.0.xmatplotlib 3.7.x及以下Python 3.9numpy 1.23.x ~ 1.26.xpandas 1.5.x ~ 2.2.xmatplotlib 3.8.x及以下Python 3.10numpy 1.26.x、2.xpandas 2.0.x、2.2.xmatplotlib 3.8.x、3.9.xPython 3.11numpy 1.26.x、2.xpandas 2.1.x、2.2.xmatplotlib 3.8.x、3.9.x这张表不是绝对精确但它反映了常见的wheel发布规律新版Python会逐步停止对旧包版本的支持新版本的库也可能要求更高版本的Python。我的经验是内网环境一般不需要追最新版选一个在你Python版本下能装上的稳定版本就够用了。比如Python 3.8环境下numpy用1.24.x、pandas用1.5.x、matplotlib用3.7.x这三个组合就很稳妥也足够日常数据分析用。3. 实操在联网机器上把安装包准备齐全3.1 用pip download一键打包所有依赖假设你手头有一台能联网的机器Python版本和目标机一致系统平台也一致那打包依赖非常简单。先建一个目录用来放文件我习惯叫offline_packagesmkdir offline_packages cd offline_packages pip download numpy pandas matplotlib -d ./执行完以后这个目录里会出现一堆whl文件包括numpy、pandas、matplotlib以及它们的所有依赖。你可以用lsWindows下是dir看一下确认文件数量。我实测下来这组依赖大概会生成15个左右的wheel文件具体数量取决于版本但大体在十几个上下。如果你的目标是照顾到不同Python版本或不同平台可以在pip download命令后面追加参数。比如pip download numpy pandas matplotlib -d ./ --python-version 39 --platform manylinux2014_x86_64 --only-binary:all:这个命令的意思是为Python 3.9、Linux x86_64平台下载纯二进制wheel包。注意一旦指定了--platform和--python-version必须加上--only-binary:all:否则pip会尝试下载源码包那样就失去意义了。不过一般情况下我不建议在联网机器上搞这种跨平台下载因为很容易因为glibc版本差异导致装不上最稳的还是用一台和目标环境完全一致的联网机器来下载。下载完之后你可以顺手把pip本身也离线化。目标机器上的pip版本如果太老可能解析不了新版本的wheel元数据我遇到过Python 3.6自带的pip 9连numpy 1.19的whl都不认的情况。解决办法是在联网机器上执行pip download pip -d ./把pip的wheel也一起拷过去离线装完别的包之前先把pip升级了。这一步很多人会忽略但往往能省去很多莫名其妙的报错。3.2 手动去PyPI下载wheel时的注意事项如果因为网络限制或者其他原因你只能用浏览器去PyPI或镜像站手动下载文件那有几个点必须盯紧。第一看准文件名里的平台标签和Python版本标签。PyPI的文件列表页一般会显示numpy-1.24.3-cp310-cp310-win_amd64.whl这种全名照着下载就行不要被一堆相似名称迷惑。第二优先选.whl结尾的文件而不是.tar.gz源码包。源码包在目标机器上安装时可能需要编译断网环境下缺少编译器和依赖库很容易失败。第三实在找不到完全匹配的whl时退而求其次找py3-none-any.whl这类纯Python包这类包对版本和平台比较宽容但numpy、pandas、matplotlib这种带C扩展的库基本没有纯Python版本所以该匹配还是得匹配。手动下载还容易漏依赖我的经验是把每个包的依赖关系理清楚再动手。怎么查在联网机器上装好这些包之后执行pip show pandas输出信息里的Requires一行会列出它依赖哪些包。比如Requires: numpy, python-dateutil, pytz这样的输出。把这些依赖串成一个清单再去下载就能避免漏包。如果嫌麻烦还是那句话用pip download自动搞定依赖最省心。4. 实操在断网机器上完成离线安装4.1 Windows环境安装完整流程把offline_packages目录拷到断网机器上之后我建议放在一个不含中文和空格的路径下比如D:\offline_packages避免出现编码问题。然后打开cmd先确认当前使用的Python解释器python -m pip --version如果在目标机器上敲python -m pip提示找不到模块说明pip可能没有装或者环境变量有问题这时候需要先修复基础环境比如下载get-pip.py到联网机器拷过来之后执行python get-pip.py安装pip。准备好之后进入刚才的目录执行批量安装命令cd /d D:\offline_packages python -m pip install --no-index --find-links./ numpy pandas matplotlib命令里的--no-index告诉pip不要联网查PyPI--find-links./告诉pip去当前目录找所有可用的wheel包后面再跟上你想要安装的包名。pip会自动在当前目录里匹配版本和依赖这个过程是离线的不会发起到外网的任何请求。等到命令执行完看到Successfully installed这行输出说明安装成功。Windows上最怕出现的问题是依赖包顺序不对但用--find-links方式的话pip会自己处理顺序所以你完全不用管谁先装谁后装这一点比手动逐个pip install xxx.whl省心得多。4.2 Linux环境安装完整流程Linux下的操作思路和Windows一致但有几个小差别。假定U盘挂载在/mnt/usb离线包在里面cd /mnt/usb/offline_packages python3 -m pip install --no-index --find-links./ numpy pandas matplotlib先强调一点Linux下一定要确认python3命令指向的版本和下载wheel时的版本一致。比如你联网机器用的是Python 3.8目标机器上的python3却是3.6那安装时依然会失败。遇到多个Python版本并存的机器优先用python3.8 -m pip这种方式指定精确版本。还有一点如果目标机器是CentOS 7或类似的旧系统系统自带的Python 3.6和OpenSSL版本都比较老很多新版本wheel装不上建议把Python升级到3.8以上再装这些数据分析库否则numpy、pandas的新版本基本没有对应wheel。装完以后验证一下能不能正常导入python3 -c import numpy; print(numpy.__version__) python3 -c import pandas; print(pandas.__version__) python3 -c import matplotlib; print(matplotlib.__version__)三个命令都能正常输出版本号就说明环境已经OK了。我第一次给一台内网Linux服务器离线装pandas的时候就是没注意系统自带Python版本太老结果折腾了整整一个下午。后来老老实实把Python升到3.8离线装包十分钟搞定。4.3 批量安装完成后如何验证环境没问题安装完成不等于万事大吉还要做个简单的功能验证。不要只验证版本号还要验证这些库能不能真正协同工作。我用的是最基础的一段代码验证numpy的数组计算、pandas的DataFrame操作和matplotlib的绘图后端加载import numpy as np import pandas as pd import matplotlib matplotlib.use(Agg) import matplotlib.pyplot as plt data np.linspace(0, 2 * np.pi, 100) df pd.DataFrame({x: data, y: np.sin(data)}) plt.plot(df[x], df[y]) plt.title(offline test) plt.xlabel(x) plt.ylabel(sin(x)) plt.savefig(test.png) print(all ok)这段代码里matplotlib.use(Agg)很关键它在没有图形界面的服务器上强制使用非交互式后端避免因为缺少GUI库而报错。如果能正常保存出test.png说明numpy、pandas、matplotlib三者都工作正常。日常数据分析里最常用的场景基本都能跑通了。5. 常见坑位与排查指南5.1 module numpy has no attribute float 这一类兼容性报错这个报错近两年特别高频。原因在于numpy 1.24版本开始官方正式移除了np.float、np.int、np.bool这些旧的类型别名只保留np.float64、np.int64、np.bool_。很多老项目、老代码里写的是np.float拿到新版本numpy上运行直接就报AttributeError: module numpy has no attribute float。离线环境下遇到这个问题解决思路有两种。第一种是检查线上其他代码程序对numpy版本的要求如果项目本身不依赖新特性那就把numpy降到1.23.5及以下版本这个版本依然支持np.float这些别名。第二种是修改代码把np.float改成np.float64把np.int改成np.int64这样的代码还能兼容新版本。我个人更建议第二种因为改代码是一次性的而降版本会影响后续新包的兼容性。如果你在内网给老项目搭环境一定要先确认代码里用了哪些numpy的写法再决定选哪种方案。5.2 not a supported wheel on this platform 平台标签不匹配这个报错基本可以断定是wheel平台标签和当前环境对不上。我遇到过的情况有三种第一种是Python版本不对下载了cp311的包目标机器是Python 3.10第二种是系统位数不对下载了win_amd64的包结果系统是32位第三种是Linux下下载了manylinux2014的包但目标机器的glibc版本过老连manylinux2014的最低要求都达不到。排查方法很简单按照第2节说的流程重新核对Python版本和系统架构。这里给个实用建议如果你不确定目标环境的glibc版本在目标机上执行ldd --versionLinux或者查看/etc/os-release确认系统版本再回到联网机器上下载对应的manylinux标签。下载的时候优先选择manylinux_2_17_x86_64这种标签它对CentOS 7、Ubuntu 18.04及更新版本都有较好的兼容性。5.3 import时报DLL加载失败或缺少共享库Windows下可能报ImportError: DLL load failed while importing numpyLinux下可能报ImportError: libopenblas.so.0: cannot open shared object file。这类问题是numpy、pandas、scipy这些带底层二进制依赖的库特有的它们依赖BLAS、OpenBLAS、LAPACK这些数学库以及Microsoft Visual C Redistributable运行库。Windows环境下最直接的解决办法是安装对应版本的Visual C Redistributable比如VS2015-2022的那个运行库安装包。很多内网机器其实本身就有但有些精简版系统没有。Linux环境下通常是系统缺少OpenBLAS或libgfortran可以通过离线RPM包或者apt离线源来安装但这个过程比较繁琐。我的建议是遇到这种问题先别急着折腾确认一下系统基础库里有没有libgfortran和libopenblas没有就到联网机器上下载对应的离线安装包把系统依赖补齐再装Python包。5.4 离线安装常用命令速查把常用的操作整理成一张速查表方便现场排查时快速翻阅操作命令联网机下载包及依赖pip download numpy pandas matplotlib -d ./断网机批量安装python -m pip install --no-index --find-links./ numpy pandas matplotlib断网机安装单个包python -m pip install --no-index --find-links./ numpy查看包依赖pip show pandas验证导入python -c import numpy, pandas, matplotlib; print(ok)升级离线pippython -m pip install --no-index --find-links./ pip这套命令组合我在Windows 10、CentOS 7、Ubuntu 20.04上都实测过只要版本匹配成功率很高。建议把整条流程在联网机器上先演练一遍U盘里多留几个不同版本的wheel备用这样到了现场基本不会慌。最后分享一个我自己的习惯我在内网机器上装完这批包之后会在项目目录里放一个requirements.txt内容就是numpy、pandas、matplotlib以及对应的版本号比如numpy1.24.3。下次再遇到新机器直接照着这个文件用pip download -r requirements.txt把依赖打包一遍全程不用动脑筋。这个习惯帮我省了很多重复沟通的功夫也算给同样被困在离线环境里的你一个参考。
返回列表