资讯动态

Linux离线安装Python3.6.5:源码编译、依赖处理与pip离线部署全攻略

发布时间:2026/10/13 13:46:06 来源:尧图企业网站定制
简介面向需要在内网或离线环境快速搭建Python开发环境的AI及Web开发者这份Python 3.6.5离线安装包已打包numpy、pandas、tensorflow、Django、djangorestframework、SQLAlchemy、PyMySQL、elasticsearch等常用科学计算与Web框架依赖解压即可运行并已在CentOS 6.5、CentOS 7及RedHat上验证通过可免去逐一下载依赖和手工编译的步骤。压缩包共约2000个文件大小158.82MB以pyc编译文件、py源码、so动态库和头文件为主同时包含文档、配置及各类辅助资源可完整支撑离线环境下的开发与测试。该包已将常见依赖整合成一个整体用户拿到后可直接引用相关库进行开发或部署无论快速搭建原型、训练模型还是启动Django服务均能获得一致且可复现的Python运行环境。目前已有4153人学习下载适合需要固定版本、受限网络或追求部署效率的开发者。1. python3.6.5 的 Linux 离线安装包先想清楚你要的是解释器还是运行环境很多内网机器装 python3.6.5 linux 离线安装包卡住的不是下载而是依赖。有人拷了一个源码包进去./configure报 no acceptable C compiler后面又报 ssl 模块没编进去pip 连本地目录都装不好。真正的问题不是“没有安装包”而是“离线环境下没人替你解决编译依赖链”。如果你的目标只是跑一个python3.6解释器半小时能编译完如果还要把项目里的第三方库一起带进去就得照着依赖链多准备十个包。本文按我自己在离线环境里做 Python 3.6.5 交付的完整链路讲先把形态选对再讲编译参数最后说坑。2. 离线安装前先选形态源码包、rpm 还是直接拷目录2.1 先判断环境发行版、glibc 和编译器决定你的路线拿到一台离线机器不要上来就解压安装包。先用三条命令确认环境cat /etc/os-release # 看发行版和版本号 ldd --version 21 | head -n 1 # 看 glibc 版本 uname -m # 确认 x86_64 还是 aarch64 gcc --version 21 | head -n 1 # 确认有没有编译器第一行决定你能不能走 rpm/deb 路线第二行和第三行决定你能不能直接拷贝编译好的目录。glibc 是关键边界同一个发行版大版本内拷目录一般没问题跨大版本就很容易出现/lib64/libc.so.6: version GLIBC_2.14 not found这种启动错误。源码包对 glibc 的约束小很多因为你在哪台机器上编译就针对哪台机器的系统库生成二进制。这也是为什么我倾向于源码编译而不是到处找一个现成的“绿色版 Python”。gcc 这条命令也很重要。如果输出是no gcc源码包路线就需要先解决编译工具链。常见做法是找同版本系统镜像、或者从内网 yum 源里装gcc make zlib-devel openssl-devel。不要幻想绕开编译器Python 的 C 扩展模块和ssl、zlib、sqlite3这些核心模块都必须进入 C 编译流程。2.2 三种离线包形态怎么选形态适合场景主要风险我的建议官方源码包Python-3.6.5.tgz长期维护、多台部署、版本可控需要 gcc 和依赖头文件默认首选发行版 rpm/deb 包公司内网仓库已经缓存版本往往不是精确 3.6.5依赖会被自动带出来但离线仓库要全有镜像环境才用编译好的安装目录同系统、同 glibc、同架构快速批量复制跨发行版或跨 glibc 直接崩只用于“批量同配置”有人会把 Miniconda 离线包也算进来。它确实是一个完整的 Python 3.6 环境体积大而且 conda 的依赖解决逻辑在你没有配置内网 channel 时也容易卡住。我一般只在科学计算场景里用 conda普通 Python 应用还是官方源码包更干净。选用源码包的核心理由Python 3.6.5 已经是很老的版本大部分发行版不会专门为它做维护补丁与其等某个仓库碰巧有不如自己把编译参数固定下来之后每台机器都用同一套命令跑结果可预期。3. 用源码包编译 python3.6.5从 openssl/zlib 到 pip 的最小流程3.1 离线依赖包不只 Python 一个Python 3.6.5 的官方源码包叫Python-3.6.5.tgz但纯内网编译时你还需要下面这些东西依赖用途缺失表现gcc / make编译工具链configure 直接失败openssl 源码包ssl 模块、pip 联网编译后 import ssl 失败zlib 源码包gzip、pip 解压import zlib 失败readline 源码包交互式命令行历史上下键不可用sqlite 源码包sqlite3 模块import sqlite3 失败libffi 头文件ctypes 模块_ctypes 缺失最常见的做法是先把这些包传到/opt/offline/src再统一装到一个公共前缀/opt/offline/prefix最后 Python 的CPPFLAGS和LDFLAGS都指着它。这样系统自带的旧头文件不会干扰你。mkdir -p /opt/offline/src /opt/offline/prefix cd /opt/offline/src # 下面文件名里的 xxx 替换成你实际拿到的版本目录名 tar -xzf Python-3.6.5.tgz tar -xzf openssl-xxx.tar.gz tar -xzf zlib-xxx.tar.gz我一般会优先编译 openssl 和 zlib。openssl 的安装目标是让 Python 能找到统一的头文件和动态库避免系统自带的 openssl 太旧或路径太散。这里注意openssl 的./config要加sharedPython 后面加载_ssl.so时才能链接到动态库同时加上-fPIC让最终生成的 libpython 可以安全打包成共享库。cd /opt/offline/src/openssl-xxx ./config --prefix/opt/offline/prefix -fPIC shared make -j$(nproc) make install_swinstall_sw只装软件部分不装文档和 man page离线环境里能省点事。接下来 zlib 就简单了cd /opt/offline/src/zlib-xxx ./configure --prefix/opt/offline/prefix make -j$(nproc) make install如果后面 import zlib 还失败大概率不是没装而是 Python 编译时找不到/opt/offline/prefix/include/zlib.h这个问题在下个步骤里通过CPPFLAGS解决。readline、sqlite 如果没有特殊版本要求也可以用同样的./configure --prefix/opt/offline/prefix流程装进同一个目录。3.2 configure 参数怎么给prefix、shared、rpath 一次说清进入 Python 源码目录之后我给 3.6.5 的推荐参数是这样cd /opt/offline/src/Python-3.6.5 export PKG_CONFIG_PATH/opt/offline/prefix/lib/pkgconfig:$PKG_CONFIG_PATH ./configure \ --prefix/usr/local/python3.6 \ --enable-shared \ --with-ensurepipinstall \ CPPFLAGS-I/opt/offline/prefix/include \ LDFLAGS-L/opt/offline/prefix/lib -Wl,-rpath,/usr/local/python3.6/lib make -j$(nproc) make altinstall--prefix/usr/local/python3.6是让 Python 完全装在一个独立目录里不动系统/usr/bin/python。--enable-shared会生成libpython3.6m.so很多第三方扩展和调用方以后会通过这个动态库去加载解释器不要省。加了 shared 之后运行python3.6时如果找不到这个 so命令行会直接报 “error while loading shared libraries”所以LDFLAGS里的-Wl,-rpath,/usr/local/python3.6/lib不能丢它把运行期搜索路径写进了可执行文件。如果你不用 rpath后面就得靠LD_LIBRARY_PATH那样每个使用方都得改环境变量太容易被坑。make altinstall和make install的区别是altinstall 只安装python3.6和pip3.6不会擅自创建python3软链接这能避免覆盖系统里可能已经存在的 Python 3。很多系统工具依赖/usr/bin/python一旦被替换yum 这类工具就会原地翻车。还有一点--with-ensurepipinstall会顺带装 pip。如果你发现 altinstall 之后没有pip3.6就手动执行一次/usr/local/python3.6/bin/python3.6 -m ensurepip --upgrade装完之后建议立刻写一个环境变量文件不然下一个登录用户找不到命令echo export PATH/usr/local/python3.6/bin:$PATH /etc/profile.d/python36.sh source /etc/profile.d/python36.sh没有 root 权限的话把--prefix改成$HOME/python3.6并把上面这个 export 写进~/.bashrc后面逻辑完全一样。3.3 装完先不要急着跑业务做三件事验证离线环境里最容易出现“python3.6 能启动但核心模块残缺”的情况。我每次装完都会这么检查/usr/local/python3.6/bin/python3.6 -V /usr/local/python3.6/bin/pip3.6 -V /usr/local/python3.6/bin/python3.6 - PY import ssl, zlib, sqlite3, ctypes print(ssl.OPENSSL_VERSION) print(sqlite3.sqlite_version) PYssl很重要pip 即使离线安装也依赖它做本地 wheel 校验zlib 缺失会让解压缩类操作失败sqlite3 是很多内部框架默认要用到的。最后一个ctypes是查 libffi 的很多扩展库底层会用到。这一段脚本里任何一个 import 报错都要回到前面的依赖安装步骤不要带着残缺解释器继续往下做。4. 离线装第三方库用 pip download 把整个依赖树搬进内网4.1 在联网机器上拉取 cp36 的 wheel离线安装不只是把 Python 解释器装好真正难的是把第三方库一起带进去。我一般会在另一台能联网、并且也装了 Python 3.6.5 的机器上执行pip download然后打包拷进内网。为什么要强调同版本因为 wheel 文件名里的cp36-cp36m-manylinux1_x86_64直接绑定解释器版本和 ABI。用 Python 3.10 的机器去下 Python 3.6 的包也能指定目标平台参数但依赖解析会有边界问题最省事的是让 pip 从真实运行环境里计算兼容标签。准备工作很简单mkdir -p /tmp/wheelhouse cd /tmp/wheelhouse cat requirements.txt EOF requests2.25.1 numpy1.19.5 EOF python3.6 -m pip download \ -r requirements.txt \ -d wheelhouse这条命令会把每个包的 wheel 或者 sdist 下载到wheelhouse目录同时把依赖树一起拉下来。如果你希望只下载预编译的二进制 wheel不加源码包就加上python3.6 -m pip download \ -r requirements.txt \ -d wheelhouse \ --only-binary:all:加这个参数的好处是下载快目标机不需要编译工具链坏处是如果某个包没有对应的 cp36 wheelpip 会直接报错。我实际更常用不带--only-binary的版本让 pip 对没有 wheel 的包退回到源码包到了内网再现场编译。要注意的是Python 3.6.5 能识别的 manylinux 标签相对老很多新版包只发布 newer 平台标签这种情况下很可能下载到一个 tar.gz。不要慌那是正常的。4.2 目标机安装--no-index 和 --find-links 才是关键把wheelhouse目录拷进内网后我习惯先打成 tar 包再传避免一个个小文件在传输工具里损坏cd /tmp tar -czf wheelhouse.tar.gz wheelhouse requirements.txt目标机解压后开始安装tar -xzf wheelhouse.tar.gz -C /opt/ cd /opt/wheelhouse /usr/local/python3.6/bin/pip3.6 install \ --no-index \ --find-links. \ -r requirements.txt--no-index是核心它告诉 pip 不要访问 PyPI也不要访问任何默认 index。如果不加内网机器哪怕只有一个不走的默认 index 配置pip 也会卡在连接超时上。--find-links.指定本地扫描目录pip 会在当前目录里找 wheel 和 sdist。-r requirements.txt保证版本约束一致避免因为没有索引而导致 pip 装了某个恰好不兼容的上游版本。如果你不想在每条命令里都带这俩参数也可以设置环境变量export PIP_NO_INDEX1 export PIP_FIND_LINKS/opt/wheelhouse以后直接pip3.6 install -r requirements.txt等效于只依赖本地目录。4.3 没有 cp36 wheel 的包按源码包流程补离线装包最常见的报错是这个ERROR: Could not find a version that satisfies the requirement xxx大部分情况不是包不存在而是目标机器上的 pip 没有把它唯一能用的 wheel 判定为兼容。Python 3.6.5 自带的老 pip 对 newer manylinux 标签支持有限。处理顺序我一般是这样先把 pip 本身升级到一个还能支持 Py3.6 的较新版本因为老 pip 解析本地文件时兼容性判断也会翻车。升级方式就是先把 pip 的 wheel 拉下来然后在目标机本地安装。如果升级完还找不到那就是这个包确实没有 cp36 的预编译 wheel只能用源码包python3.6 -m pip download \ --no-binary:all: \ -r requirements.txt \ -d /tmp/sdist目标机上安装源码包时会现场调用 gcc所以要确认第 2.1 步的编译器还在。像 numpy、pandas 这种大型源码包在老旧服务器上编译可能非常久内存也不一定够。我做离线交付时会在内网机器上先试编一次记录实际编译时间和内存占用再决定要不要替换成其他版本或者用更小依赖的实现。5. python3.6.5 离线安装避坑清单5 个我踩过的现场5.1 现象装完 altinstall 之后系统 yum 全坏了这是最常见的杀伤性事故尤其是直接make install并且把 Python 装到/usr/local/bin时。原因很简单make install会创建python3软链接而系统自带的/usr/bin/python3被 PATH 里的新软链接盖住后依赖它的系统工具就乱了。解决方式是我在前面强调过的make altinstall另外在检查 PATH 时确认/usr/local/python3.6/bin排在他人的脚本之前即可。如果已经覆盖了别慌从原系统镜像恢复/usr/bin/python再重新编译一次单独目录。5.2 现象启动时报 libpython3.6m.so.1.0: cannot open shared object file这是--enable-shared开了但运行期找不到动态库。原因是 Python 可执行文件只记了编译期路径或者系统ldconfig不知道新目录。解决方式是先把/usr/local/python3.6/lib写进系统动态库搜索路径再执行ldconfigecho /usr/local/python3.6/lib /etc/ld.so.conf.d/python3.6.conf ldconfig如果不想动系统配置就在~/.bashrc里导LD_LIBRARY_PATH但这会造成“当前用户能跑服务进程不能跑”的诡异现象不适合做生产环境。5.3 现象python3.6 能启动但 import ssl 报 ModuleNotFoundError这个坑特别隐蔽因为解释器本身没坏pip 也能显示版本但真正跑 HTTPS 请求时挂。原因是编译 Python 时openssl 的头文件没有被CPPFLAGS指对位置导致_ssl模块根本没编进去。解决方式不是重装 openssl而是回到第 3.2 步确认CPPFLAGS-I/opt/offline/prefix/include里有 openssl 头文件路径然后重新./configure make clean make altinstall。我用一个简单验证堵住它python3.6 -c import ssl; print(ssl.OPENSSL_VERSION)只要这句过了后面 pip 基本不会再因为证书问题翻车。5.4 现象离线 pip install 时还是显示 Looking in indexes我已经写了--find-links但发现 pip 还在连接某个默认源最后超时。原因是机器上设置了PIP_INDEX_URL环境变量或者全局 pip.conf 里配了 index而--no-index只对本次命令行生效却可能被环境变量覆盖。解决方式是排查三处环境变量里有没有PIP_INDEX_URL/etc/pip.conf和~/.config/pip/pip.conf里有没有 index-url 配置。最干净的做法是执行安装时显式加--no-index并且在命令里临时清掉PIP_INDEX_URLunset PIP_INDEX_URL /usr/local/python3.6/bin/pip3.6 install --no-index --find-links/opt/wheelhouse -r requirements.txt之后再用pip config list查看生效配置。5.5 现象用新机器下载的 wheel 拿到内网提示平台不兼容这是平台标签和 glibc 标签之间的边界问题。你在一台 glibc 较新、Python 3.10 的机器上按 “目标 Python 3.6” 下载下载到的不一定能在老机器上跑。原因是 manylinux 兼容标签向下兼容的判断和实际运行时动态链接库对应不上。解决方式是按我前面说的用一台真实 Python 3.6.5 的环境去下载或者把包固定成已经验证过的版本。批量交付时我每次都会把机器 glibc 版本和 wheel 文件名都留到一份清单里下次再发现同类问题能直接对上号。6. 少跑几台机器把装好的 python3.6.5 环境目录整体打包验证如果你手里有几十台同一系统的机器不需要每台都走一遍编译。我一般会在第一台机器上完整编译并装好依赖然后直接把目录打包复制。前提是目标机器和编译机保持同一个发行版大版本、同一个 glibc 和同一个 CPU 架构x86_64 和 aarch64 不能混用。打包时不要只打 Python 目录我会把 wheelhouse 和 requirements.txt 一起放进去形成一个可复用的交付包cd / tar -czf python3.6.5-runtime.tar.gz \ usr/local/python3.6 \ opt/wheelhouse \ opt/offline/prefix目标机上解压到同样路径cd / tar -xzf python3.6.5-runtime.tar.gz if ! grep -q python3.6 /etc/ld.so.conf.d/python3.6.conf 2/dev/null; then echo /usr/local/python3.6/lib /etc/ld.so.conf.d/python3.6.conf fi ldconfig然后跑一段最短验证确认不是“能启动”而是“能干活”/usr/local/python3.6/bin/python3.6 - PY import sys, ssl, sqlite3, zlib print(sys.version) print(ssl.OPENSSL_VERSION) PY /usr/local/python3.6/bin/pip3.6 list再到业务目录跑一次冒烟脚本。这个方法有一个边界如果你的 Python 是静态编译、没有用 rpath那复制到别的路径后PYTHONHOME和动态库路径都容易出问题。所以我在第 3.2 步特意强调 rpath就是为了让这个最后的复制方案可行。我最早做离线 Python 交付时也翻过车只拷贝了解释器目录结果下一台机器import ssl直接挂最后才发现 openssl 没跟着走。后来我养成了一个习惯所有离线环境一定同时保留三样东西——编译后的解释器、wheelhouse、以及一段 20 行的验证脚本。这套流程看着啰嗦但在内网环境下能帮你省掉大量“到了现场才发现缺一个库”的返工。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑