简介Python 3.7.3是面向Windows平台的官方安装包适合编程入门者、数据分析学习者及Web开发人员快速搭建Python运行环境。压缩包共4个文件以.exe图形化安装程序为核心另含htm格式的安装指导文档、txt格式的下载来源说明以及一个url站点快捷方式整体体积约为23.98MB。已有2285人浏览学习可用于本地开发、脚本编写或项目依赖部署。该版本在2018年发布带来了字典插入顺序保留、dataclass数据类、类型注解增强、asyncio异步支持改进、pathlib路径操作优化等实用特性能有效减少样板代码并提升开发效率。配套的htm说明文档提供了详细的安装指引包括环境变量配置与安装验证方法txt文档则补充了下载站点的使用说明读者拿到后即可按照文档完成安装快速体验Python 3.7的关键改进。1. 还在装 Python 3.7先搞清楚它到底能解决什么一个做图像处理 Demo 的开发者某天收到一条线上告警跑了两年的数据处理服务突然崩了日志指向某个依赖库的语法不兼容。他查了半天才发现生产环境装的是 Python 3.7而本地早就升到了 3.10requirements.txt 里几个关键库的新版本已经不再支持 3.7。最后他花了一整天才把环境对齐。类似的场景在各行各业的存量系统里反复出现——这就是 python3.7 安装包仍然有大量搜索需求的原因。Python 3.7 是很多遗留系统、工业软件、算法库的默认运行时。它不是最新的但它是「能跑」的代名词。这篇笔记会讲清楚三件事什么样的项目必须用 3.7怎么在不同平台上干净地装好它以及装完之后有哪些坑会让你翻车。适合手里有老项目要维护、或者因为某个依赖被迫留在 3.7 的开发者。2. Python 3.7 的真实处境哪些场景必须用它哪些场景趁早升级2.1 存量项目依赖为什么「能跑」比「版本新」更重要Python 3.7 发布于 2018 年官方维护周期早已结束。但生产环境里大量服务仍然跑在 3.7 上原因不是惰性而是依赖锁死。常见的几类情况包括某些工业控制库、老版本的深度学习推理框架、公司内部自研的 C 扩展模块只针对 3.7 做过编译还有一部分是 CentOS 7 自带 Python 版本太低开发者直接在系统 Python 上装了 3.7 然后层层叠加上业务。这类项目的共同特征是升级 Python 版本的代价远高于收益。你要验证所有第三方库在新版本下的行为要重新编译 C 扩展要处理 bytecode 缓存目录的变化甚至有些旧库在新版本直接无法安装。对这类项目「能跑」就是硬道理。如果你接手的是一个跑了三年的服务第一件事不是琢磨升到 3.11而是把 Python 3.7 环境完整复刻出来保证行为和线上一致。我的习惯是遇到这种情况先确认项目里有没有 runtime.txt、.python-version 或者 Dockerfile 里固定的基础镜像版本。这几个文件直接决定了你要装哪个小版本。不要凭感觉装最新的 3.7.x因为 3.7 系列内部的 patch 版本也有行为差异尤其是涉及 SSL 证书验证和 timezone 数据的时候。2.2 官方包与第三方发行版安装包该怎么选一说到安装包很多人第一反应是去 python.org 下载官方安装器。对大多数场景这是最稳妥的选择。官方有三个平台安装包Windows 的可执行安装器、macOS 的 pkg 安装器、Linux 下的源码包。Windows 和 macOS 安装器都有图形界面适合个人电脑Linux 下我更推荐用 pyenv 编译安装而不是直接用系统自带的包管理器。为什么不用 apt 或 yum 直接装因为系统包管理器里的 Python 3.7 往往不是完整版本有些发行版会打补丁、改配置路径甚至把 pip 单独拆成一个包。你装完发现 python3.7 能运行但 pip3.7 不存在还要再去装 python3.7-pip一套折腾下来不如直接用 pyenv 干净。还有一种选择是 Conda。如果你的工作流已经围绕 Conda 展开那用conda create -n py37 python3.7建一个环境是最省事的。Conda 的好处是自带的科学计算库预编译完整不用自己处理编译依赖坏处是环境体积大而且和系统上其他 Python 工具链的交互偶尔有玄学问题。两条路都可以走关键是选一条后别混用。2.3 3.7 的边界遇到这些情况就别挣扎了Python 3.7 不是万能的有些场景我建议你趁早死心。第一如果项目需要用到 Python 3.8 之后才加入的语法特性比如海象运算符在表达式中赋值以外的用法、f-string 的调试符号、或者 positional-only parameters 的某些写法3.7 直接语法报错没有任何安装参数能解决。第二某些新版本库已经声明Requires-Python 3.8pip 在 3.7 环境里解析依赖时会直接拒绝安装你只能去找旧版本。第三也是容易被忽略的一点如果你要跑的是新出的机器学习框架或工具链直接用 3.7 装大概率会失败。这类项目对 Python 版本的要求很激进官方文档都明说支持 3.9 以上。这种情况下硬装 3.7 不是省事是给自己找麻烦。我更建议先看清依赖声明的下限再决定是不是要停留在 3.7。还有一种边界是安全性的问题。3.7 不再有官方安全补丁如果你要把服务暴露在公网并且涉及解析不可信输入的场景风险自负。内网工具、离线环境、受控的生产集群用 3.7 问题不大公网服务建议至少用一个还在维护的版本或者在前面加一层代理做协议校验。3. 三平台安装实操从下载到验证的完整命令3.1 Linux / macOS用 pyenv 安装 3.7 的标准流程Linux 和 macOS 上最干净的 Python 3.7 安装方式是用 pyenv 编译。pyenv 会把 Python 装到用户目录下不碰系统自带的 Python这对避免把系统环境搞坏至关重要。先确认本地有没有 pyenv# 检查 pyenv 是否已安装没有的话先用包管理器装 pyenv --version # Ubuntu / Debian 用户 # sudo apt install -y make build-essential libssl-dev zlib1g-dev \ # libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-devpyenv 安装完成后编译 Python 3.7 需要一些系统依赖库。这个过程里最容易出错的是缺少 libssl-dev 和 libbz2-dev前者会导致 3.7 编译后没有 ssl 模块后者会导致 bz2 模块缺失。很多开发者装完后用pip install时报 SSL 错误其实就是这一步漏了。# 列出 3.7 系列的所有小版本选一个 pyenv install --list | grep 3.7 # 安装 3.7 系列末版 pyenv install 3.7.17 # 在某个项目目录里锁定版本 cd ~/my_legacy_project pyenv local 3.7.17pyenv 背后的原理是源码编译整个编译过程大约 3 到 10 分钟取决于机器性能。装完后pyenv local会在当前目录生成一个.python-version文件之后每次进入这个目录python命令自动指向 3.7.17。这是我处理存量项目最常用的一套流程因为它把版本选择完全绑定在项目目录上不同项目互不干扰。macOS 用户要注意一个问题如果你装的是 Apple Silicon 芯片的 Mac直接编译是没问题的但某些依赖库在 3.7 下需要区分 arm64 和 x86_64 架构。常见做法是确认所有依赖都有对应架构的 wheel如果遇到编译错误检查一下是否在用 Rosetta 的终端里操作两种终端环境下编出来的 Python 行为可能不一致。3.2 Windows安装器安装与 PATH 处理的注意点Windows 上官方提供的 exe 安装器是最直接的路径。双击安装时有一个关键选项容易被忽略安装界面底部有「Add Python 3.7 to PATH」的勾选框默认是不勾的。如果不勾装完后你在命令行敲python会提示找不到命令很多人以为没装上其实只是 PATH 没配。# 安装后验证如果勾选了 PATH python --version # 如果提示找不到命令手动把 Python 安装目录加进 PATH # 常见安装位置C:\Users\用户名\AppData\Local\Programs\Python\Python37 # 以及同名目录下的 Scripts 子目录Windows 安装器还有一个细节要注意不要勾选「Install for all users」除非你确定要装到C:\Program Files下。装在用户目录的好处是不需要管理员权限对权限受限的办公电脑特别友好。另外安装器里可以把 pip 一并装好它会出现在 Scripts 目录下验证方式是在命令行里执行pip --version # 如果报错确认 Scripts 目录是否在 PATH 里Windows 用户还容易遇到一个问题电脑上已经装了 Python 3.9 或 3.11再装 3.7 后命令行里python指向的还是旧版本。这不是安装失败而是 PATH 的搜索顺序问题。Windows 的 App Execution Alias 会优先把新版本放到前面所以你可能需要调整 PATH 顺序或者直接用py -3.7来启动 3.7 解释器。Windows 自带 Python Launcher这个命令比改 PATH 省事得多。3.3 安装后的最小验证python -V 不够还要查什么装完 Python 3.7 之后很多人运行python -V看到版本号就以为大功告成。这远远不够。我见过太多环境在业务代码跑起来之后才暴露出缺失ssl 模块没编译进去ensurepip 没有可用sqlite3 支持为空。这些问题在python -V里全都看不出来。# 一次性检查关键模块是否可用 python - EOF import sys, ssl, sqlite3, bz2, lzma print(sys.version) print(SSL OK:, ssl.OPENSSL_VERSION) print(SQLite OK:, sqlite3.sqlite_version) print(bz2 OK:, bz2.__name__) print(lzma OK:, lzma.__name__) EOF这段脚本输出的每一项都有实际意义。ssl 模块缺失会导致 pip 无法访问 HTTPS 源这是最致命的问题sqlite3 缺失会让很多用到内置数据库的业务直接崩溃bz2 和 lzma 影响的是数据压缩和解压功能数据处理类项目几乎必然会碰到。如果检查发现某个模块是空的原因基本可以确定是编译前缺少对应的系统开发库回到第一步补装依赖后重新编译。还有一个容易被忽略的验证点是确保pip本身可用。Python 3.7 内置了ensurepip但某些发行版或者手动编译时可能没带上。验证方式是python -m pip --version # 如果报错先尝试启动 ensurepip python -m ensurepip --upgrade到这里一个可用的 Python 3.7 就算装完了。但我还要多说一句如果你是在容器里使用 3.7最省心的不是手动装而是直接找现成的官方基础镜像。拉一个python:3.7镜像所有编译步骤都替你完成了。唯一要确认的是镜像的底层系统和你的部署目标一致避免 glibc 版本不匹配导致运行时行为异常。4. 装完只是开始虚拟环境与 pip 源配置决定你能不能顺手4.1 venv 隔离环境的标准姿势系统级的 Python 3.7 装好后接下来必须做的是为项目创建虚拟环境。直接往系统 Python 里pip install是一个早晚会后悔的做法因为不同项目的依赖版本互相踩踏装到后面你根本不知道当前环境里到底有什么。Python 3.7 自带 venv 模块不需要额外安装 virtualenv。创建环境的方式非常直接# 在项目目录下创建 .venv 目录 python -m venv .venv # 激活环境 # Linux / macOS: source .venv/bin/activate # Windows: .venv\Scripts\activate激活之后命令行提示符会带上环境名。这时pip install装的所有包都会落到.venv目录里不会污染全局。我个人的习惯是永远不使用deactivate或者切来切去而是直接在当前终端里跑完业务逻辑。项目多了之后每个终端对应一个项目环境互不干扰思路也清晰。有一个 3.7 的细节需要提醒venv 创建时会默认带上 pip但如果你用系统包管理器装的 Python 3.7可能没有 ensurepip 模块导致 venv 创建失败并提示无法安装 pip。解决方式是先通过系统包管理器安装python3.7-venv这个配套包或者回到源码编译时的依赖检查补上 ensurepip 相关的开发包。4.2 pip 源配置与依赖锁定回到国内网络环境直接使用默认 PyPI 源经常出现超时或者下载中断解决方式是配置一个镜像源。我习惯把配置写在~/.pip/pip.confLinux / macOS或者%APPDATA%\pip\pip.iniWindows这样所有项目都生效[global] index-url https://pypi.tuna.tsinghua.edu.cn/simple trusted-host pypi.tuna.tsinghua.edu.cn timeout 60这段配置只做一件事让 pip 从镜像源拉包。timeout 60是把连接超时时间从默认的 15 秒延长到 60 秒对某些体积较大的包更友好。配置完成后用pip install之前先跑一次pip config list确认配置已生效。依赖锁定方面在 Python 3.7 时代还没有现在这么成熟的工具链最稳妥的方式是生成 requirements.txt 并固定版本号# 导出当前环境的全部依赖及精确版本 pip freeze requirements.txt # 在另一台机器上按文件恢复 pip install -r requirements.txtpip freeze导出的文件里会包含一些间接依赖恢复时直接按文件装。注意这里有个坑pip freeze输出的依赖可能在平台间不一致特别是包含编译型包时Windows 上生成的版本号在 Linux 上未必能原样装上。跨平台迁移时最好只锁直接依赖把间接依赖交给 pip 的解析器去处理。4.3 用 pipenv / poetry 管理旧版依赖的取舍除了 requirements.txt还有另外两条路线可以管理 Python 3.7 项目的依赖Pipenv 和 Poetry。在 3.7 的年代Pipenv 一度是官方推荐的方案它把包管理和虚拟环境合在一起pipenv install会自动创建虚拟环境并安装依赖。Poetry 则是后来者以现代解析器著称依赖解析更严谨。用 Pipenv 的典型流程# 安装 pipenv到当前 Python 3.7 环境 pip install pipenv # 在项目里创建环境并安装依赖 pipenv install requests2.24.0 # 激活环境 pipenv shellPipenv 的麻烦在于它的锁文件解析速度慢而且某些包在旧版 Python 下的依赖分析会有误判。Poetry 在 3.7 下也能用只不过对 Python 3.7 的官方支持在 1.2 版本之后就逐渐弱化了。如果你维护的是老项目已经用 Pipenv 在管理继续用下去没毛病如果是从零开始我建议直接用 venv requirements.txt简单可靠出了问题也好排查。工具链越复杂在旧版本 Python 上的兼容问题越多这是运维层面的经验不是理论推演。5. 避坑指南Python 3.7 安装路上最常翻车的 5 个地方5.1 现象pip install 报 SSL 证书验证失败复现步骤是刚装完 Python 3.7执行pip install requests提示SSLError: certificate verify failed。刚开始以为是网络问题反复换源也没效果最后查了很久才发现是 Python 3.7 编译时没有正确链接系统的 OpenSSL 库。原因是 Python 源码编译时如果没有找到 OpenSSL 的头文件和库文件ssl模块就不会被编译进解释器。pip 在 HTTPS 传输时依赖这个模块没有它自然就报错。解决办法是回到编译之前安装libssl-dev或者openssl-devel重新运行pyenv install 3.7.17做一个全新编译。补充一个细节某些 Linux 发行版的 OpenSSL 版本太新Python 3.7 的老代码对 OpenSSL 1.1.1 以上的支持是完整的但如果系统默认是 OpenSSL 3.0编译时有可能遇到类型不匹配问题。这个时候需要确认openssl命令的版本如果确实太新考虑安装一个兼容库或者用 Docker 基础镜像解决不要在源码编译这一棵树上吊死。5.2 现象解压 tar 包时提示 No module named bz2服务部署到新机器后一跑代码就报ModuleNotFoundError: No module named bz2查了 requirements.txt 里根本没有这个库。问题是 lzma 和 bz2 是标准库的一部分但需要编译时对应的系统库存在。Python 3.7 编译时缺了libbz2-dev解释器就静默地跳过了这个标准库。解决方式和 SSL 类似安装libbz2-dev和liblzma-dev之后重新编译。这个问题的隐蔽点在于python -V不会报错业务代码不调用这些模块也发现不了异常往往是上线跑了一段时间才暴露。所以我在前面专门写了一个验证脚本建议在安装完成后立刻跑一遍不要等到崩溃才排查。5.3 现象pip freeze 生成的 requirements 在 Windows 上装不了在一台 Windows 机器上pip freeze requirements.txt拿到另一台 Linux 服务器上pip install -r requirements.txt报错说找不到某个版本的包。这个问题的根源不是包不存在而是pip freeze会把当前平台特有的预编译包版本号固化进去。比如 Windows 上某些包带win_amd64标记Linux 环境没有对应 wheel 包pip 只能尝试从源码编译而源码编译又需要额外的系统依赖失败在所难免。我的做法是跨平台迁移时只把直接依赖写入 requirements不依赖pip freeze的完整输出或者干脆用 Conda 的conda env export来锁定跨平台环境它的处理方式在这方面更成熟。5.4 现象pyenv 安装卡在编译阶段超过 20 分钟运行pyenv install 3.7.17后编译进度条长时间不动最后报错说内存不足或者编译超时。原因很简单编译 Python 需要的内存和 CPU 比想象中多尤其在配置较低的机器或者内存受限的容器里。解决办法有两个方向一是临时增加编译并行度让编译跑得快点二是检查系统真实的内存限制。# 用 2 个并行编译任务加快速度 MAKEOPTS-j2 pyenv install 3.7.17 # 或先释放内存再编译一个加并行度的潜在风险是内存占用更高如果机器本身只有 2G 内存开-j4反而更容易被系统杀掉。先看内存再定并行度这是经验之谈。5.5 现象装完后 python 命令还是旧版本在已经安装了 Python 3.8 的机器上装 3.7装完执行python -V显示的还是 3.8让人误以为安装失败。这其实是 PATH 搜索顺序的问题系统在 PATH 中先找到了旧版本的可执行文件新装的 3.7 在后面。处理方式之一是直接使用完整路径或者py启动器来指定版本。在 Windows 上py -3.7会强制使用 3.7在 Linux 上用/usr/local/bin/python3.7这样的绝对路径。另一种方式是修改 PATH 顺序但我觉得这容易引发其他命令的连锁问题不如在项目脚本里显式指定解释器路径来得可靠。6. 进阶用一个可复现脚本把 3.7 环境一次装到位如果你需要在多台机器上重复搭建 Python 3.7 环境手工一步步操作既容易遗漏又很难追溯。我通常会把整个过程写成一个脚本包含依赖安装、版本编译、环境校验三个步骤。这样每次换机器或者重建环境执行一次脚本就能得到一致的运行时。#!/usr/bin/env bash set -euo pipefail # 1. 安装系统依赖Debian/Ubuntu 系 sudo apt update sudo apt install -y make build-essential libssl-dev zlib1g-dev \ libbz2-dev libreadline-dev libsqlite3-dev \ wget curl llvm libncurses5-dev libffi-dev # 2. 用 pyenv 安装指定版本 if ! pyenv --version /dev/null 21; then curl https://pyenv.run | bash fi pyenv install -s 3.7.17 pyenv global 3.7.17 # 3. 校验标准库完整性 python - EOF import sys, ssl, sqlite3, bz2, lzma assert sys.version_info[:2] (3, 7) assert ssl.OPENSSL_VERSION assert sqlite3.sqlite_version assert bz2.__name__ assert lzma.__name__ print(Python 3.7 environment is ready.) EOF这个脚本的核心价值在于可重复执行。pyenv install -s里的-s表示如果版本已安装则跳过不会重复编译pyenv global只是把默认版本切换过去不本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?