news 2026/10/26 2:29:16

Conda创建Python3.7虚拟环境全流程:安装、配置、迁移与避坑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Conda创建Python3.7虚拟环境全流程:安装、配置、迁移与避坑

最近好几个朋友找我,都是同一个诉求:让conda支持py3.7。有些是没装成功,有些是装上了但跑起来一堆幺蛾子。想想也能理解,Python 3.7早在2023年就停止官方维护了,但大量老项目、旧模型代码、标注工具、科研脚本,全被钉死在3.7这一档上。这时候conda就成了绕不开的版本管理工具——它能在同一台机器上同时维护多个Python版本环境,互不干扰,这正是解决“老旧项目必须在py3.7下运行”的正解。

这篇文章不是来复述conda官方文档的,我尽量把从安装、创建环境、配镜像、接IDE,到迁移D盘、删环境、处理各种报错的完整流程走一遍,把能预见的坑都提前填上。适合谁看?维护旧代码的、被“conda无法识别”折腾到怀疑人生的Windows用户、以及所有想在2024年还稳稳用着py3.7但不想把系统搞乱的人。

1. 先搞清楚:为什么现在还有人在让conda支持py3.7

1.1 不是过时,是存量项目太多

很多人问,Python 3.7不是已经EOL了吗?还在挣扎什么。问题在于,代码不会因为官方停止维护就立刻可以重写。我经手的老项目里,不少深度学习推理服务还是用TensorFlow 1.x写的,有些老版本的PyTorch轮子只发布了py37版本,换到3.8以上直接装不上;还有一些科研工具比如labelme、某些医学图像处理库,在3.7环境里跑得最稳。业务还在跑,环境就不能动,这是存量系统最常见的形态。

另外,很多企业内网服务器镜像里默认的Python版本就是3.7,想升也升不了,因为依赖的底层二进制库不支持。这时候你用conda在本地创建一个py3.7虚拟环境,既能让代码跑起来,又不影响系统自带的Python,两边互不干扰。这也解释了为什么“让conda支持py3.7”是一个真实刚需,而不是什么矫情的技术洁癖。

1.2 conda为什么适合干这件事

直接在系统上装一个Python 3.7当然也行,但后患无穷:系统自带的Python可能被覆盖,pip装包会污染全局,卸载时还容易把系统依赖搞坏。conda的核心思路是环境隔离——每个环境是一个独立目录,里面有自己的一套Python解释器、pip、第三方库,激活环境就切换PATH指向,退出环境就恢复原状。理解成“开一个独立的虚拟机”就好,只不过这个“虚拟机”专门用来装Python工具链。

更关键的是conda的依赖解析能力。Python的包之间经常有版本约束,比如A包要求B包>=1.2,C包又要求B包<=2.0,conda会基于SAT求解器找一个大家都能接受的组合。这一点在很多二进制包上尤其重要,比如numpy、opencv这类带C扩展的包,conda可以自动匹配编译好的版本,避免“源码编译失败”这类从入门到放弃的经典剧本。这也是我推荐用conda而不是pyenv或手工管理多个Python版本的核心原因。

2. 环境准备:先把手上的conda安装归置好

2.1 Miniconda还是Anaconda,别纠结

我第一次用conda时也被这个选择题卡过。Anaconda等于“全家桶”,自带几百个常用数据科学包,安装包体积好几个G,适合不想折腾、就是要立刻开始干活的人。但它有个问题:base环境里预装太多东西,包之间容易打架,排查起来很费劲。

Miniconda则只包含conda本体和一个干净的Python,其他包按需自己装。体积小、启动快、环境干净,排错也容易。做老项目兼容、跑py3.7环境,我更推荐Miniconda,因为你可以完全控制每个环境装了什么,不会出现“明明只装了A包,结果把B包版本也改了”这种诡异情况。

这两者的选择本质是“省事”和“可控”的取舍。如果你只是日常用用Notebook跑分析,Anaconda确实方便;但如果你要同时维护py3.7和py3.12等多套环境,强烈建议Miniconda,至少我实测维护多套环境时省心很多。

2.2 Windows上安装、配置PATH、初始化shell一次讲完

Windows下安装Miniconda时,安装向导里有一个“Add Miniconda3 to my PATH environment variable”的选项,不少人会犹豫。如果你希望在任何命令行里都能直接敲conda,建议勾上。但要注意,这会改变系统PATH顺序,个别情况下可能影响其他软件的Python识别——我记得有些用系统Python的旧工具会被顶掉,这时候就得自己权衡。

装完之后最常见的报错来了,终端里输入conda,返回的却是:

conda : 无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

这个报错几乎都是PATH没生效导致的。解决步骤是先把终端全部关掉再重新打开;如果不行,手动把下面这两个路径加到系统环境变量里:

C:\Users\你的用户名\miniconda3 C:\Users\你的用户名\miniconda3\Scripts

然后把新开的PowerShell或CMD目录切到任意位置,输入conda --version验证。正常情况下会显示conda版本号,比如conda 24.x.x。

另一个被问爆的问题是PowerShell下激活环境时报错,提示需要先conda init。这是因为Windows默认没有为PowerShell开放conda的初始化脚本。处理办法是执行一次初始化:

conda init powershell

如果提示“无法加载文件,因为在此系统上禁止运行脚本”,就先把PowerShell执行策略放开:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

执行完conda init之后,务必关闭并重新打开终端,否则新配置不会加载。这个“关了重开”的动作,解决了我见到的八成激活问题。

2.3 macOS和Linux上的省略版教程

如果你用的是macOS或Linux,安装更直白,下载Miniconda安装脚本后执行:

bash Miniconda3-latest-MacOSX-x86_64.sh

安装结束后,初始化对应的shell:

conda init bash # 如果用的是zsh,就 conda init zsh

最后source ~/.bashrc或重新开终端,让conda命令生效。Linux服务器上如果嫌安装文件大,还可以用清华镜像源下载Miniconda历史版本安装包,下载速度会快很多。这里多说一句:如果你只是想让本地conda能建py3.7环境,完全没必要去下载老版本的conda——新版本conda照样能创建老Python环境,真正要盯的是channel里有没有py3.7的包。

3. 核心操作:一步步创建py3.7虚拟环境

3.1 一条命令建好环境,但要知道每个参数在干嘛

假设你想创建一个名叫py37的环境,用于跑Python 3.7,命令极其简单:

conda create -n py37 python=3.7 -y

拆开看,-n py37给环境起名,python=3.7指定解释器版本,-y是跳过确认提示。执行时conda会做依赖解析,自动帮你在环境中安装Python 3.7以及配套的pip、setuptools等基础工具。

这里有个很容易误解的点:python=3.7并不是精确指定“只能装3.7.0”,conda会把它理解为一个范围约束,并选择该系列里可用的最新版本,通常情况下是3.7.17(3.7系列最后一个小版本)。如果项目对Python版本非常敏感,希望完全可控,就直接写完整版本号:

conda create -n py37 python=3.7.17 -y

我实际更倾向于指定完整版本号,因为旧项目锁定版本的第一原则就是“能不动就不动”。版本太新或太旧都可能引入微妙的差异,尤其是在依赖旧版numpy、opencv这类二进制库时,小版本偏差都能导致兼容性翻车。

3.2 找不到py3.7包时,channel配置是关键

有时候执行上面的命令会弹出PackagesNotFoundError,提示找不到python=3.7。遇到这种情况先别慌,多半是conda的channel配置问题。

新版conda默认的defaults源里通常还有3.7版本,但如果你的conda源被改成了一些精简镜像,可能只保留了较新版本的包。这时候有两个办法:一是显式加上free频道,历史Python版本大多在这个频道里:

conda config --add channels conda-forge conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/

二是先用conda search python查看当前所有channel里可用的Python版本,确认3.7.x具体还有哪些小版本,再精确锁定安装。

我踩过的一个坑是:为了追求“最新”,把conda-forge放在channel列表最前面,结果某些旧版本包在conda-forge里已经下架或标记为broken,导致找不到。所以对py3.7这种老版本环境,反而建议把官方defaults或清华镜像的main、free频道优先级调高。判断一个频道是否靠谱,直接看它有没有你要的那个版本就好。

conda search python=3.7.* --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/

3.3 顺手把conda和pip的镜像地址配置好

国内网络环境下,安装大一点的包常常卡在“Downloading”进度条上,一卡就是半小时。这就是网络问题,解决办法是配置镜像。

conda配置镜像用两条命令:

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --set show_channel_urls yes

pip的镜像单独配置,和conda互不影响:

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

配置完成后再创建环境,速度会明显改善。需要说明的是,以上镜像地址都是国内高校提供的公开源,任何时候想换回来,用conda config --remove-key channels就能清掉自定义channel,恢复默认。至于镜像的完整性和安全性,清华源在开源社区长期维护,风险相对低,强烈推荐作为首选。

3.4 用示例带着走一遍:创建、激活、验证环境

下面把这套流程走一遍,假设你要为py3.7环境创建一个最简测试:

# 创建环境 conda create -n py37 python=3.7 -y # 激活环境 conda activate py37 # 查看Python版本 python -V

激活成功后,命令行提示符会从(base)变成(py37),这时python指向的就是envs目录下的解释器,不是系统Python。为了确认这一点,Windows下运行:

where python

Mac/Linux下运行:

which python

正常情况下路径里应该包含envs\py37或envs/py37。如果这里显示的路径还在系统目录,说明环境没真正激活,或者你正在用的终端没有经过conda init初始化——别急,下一节专门讲这个。

4. 激活与联通IDE:py3.7环境不是建完就收工

4.1 conda activate失效怎么办

很多人在终端输入conda activate py37时,会碰到下面这个提示:

CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'. To initialize your shell, run $ conda init <shell_name>

这个问题的根源是conda没有把你的shell配置文件写入初始化脚本。解决办法就一行:

conda init

Windows用户如果有PowerShell和CMD两种终端,建议分别执行:

conda init powershell conda init cmd

然后关掉终端重新打开。如果你还遇到“禁止运行脚本”的报错,我前面提过,先执行Set-ExecutionPolicy RemoteSigned解决PowerShell策略限制。这一步做完,conda activate就是有肌肉记忆的操作了。

4.2 激活的两种姿势,以及怎么退出和验证

激活环境有两种姿势。一种是用环境名激活:

conda activate py37

另一种是用环境路径激活,适合你不需要把环境放在conda默认目录的情况:

conda activate D:\envs\py37

退出环境很简单:

conda deactivate

有几个细节值得注意:激活环境只对当前终端窗口生效,新开的终端窗口默认回到base环境;在IDE里运行代码时,IDE会读取你在项目配置里指定的解释器,和终端里激活了什么环境没有关系。换句话说,你在终端里activate了半天,到PyCharm里不指定环境,照样跑的还是base环境,这个问题我见得太多了。验证环境是否激活,最直接的是where python看路径。

4.3 PyCharm里接入conda环境的正确路径

PyCharm对conda的支持比较成熟,操作路径是:

File -> Settings -> Project -> Python Interpreter -> Add Interpreter -> Conda Environment

然后选“Existing environment”,在Environment文本框里选择py37环境目录下的python.exe,Conda executable选Miniconda安装目录下的conda.exe。注意别选错,在Windows下我遇到过有人把python.exe的路径指到了base环境,结果项目里显示的解释器是3.11而不是3.7,代码一跑就懵。

在PyCharm里也可以直接通过conda创建新环境:在Add Interpreter时选“New environment”,界面下方可以选Python版本、指定环境目录。这样创建的py3.7环境,PyCharm会直接识别并作为项目解释器,省去很多手动操作。我的习惯是先用命令行把环境建好、把包装好,然后再到PyCharm里选择这个已有的解释器,因为命令行下能看到完整的依赖解析过程,出错更好排查。

4.4 VSCode里选择conda环境,别看漏了“解释器”入口

VSCode使用conda环境的方法稍微隐蔽一些。打开一个.py文件后,按下Ctrl+Shift+P,输入“Python: Select Interpreter”,然后从列表里选择py37环境。列表里会同时显示base环境、系统Python和你能看到的所有conda环境,选的时候看路径即可。

更常见的场景是:你想在VSCode内置终端里用conda环境。第一步先确保VSCode的默认shell是PowerShell或CMD,第二步在终端里执行conda init powershell,重启VSCode后终端就会自动识别conda,conda activate py37才能生效。我一直觉得VSCode这个坑很隐蔽,因为它不像PyCharm那样有显式的环境配置向导,如果没做conda init,终端里敲什么都会提示找不到conda。

如果嫌每次敲activate麻烦,可以安装一些Shell扩展自动激活当前项目指定环境,但我个人不推荐依赖这类工具——不透明,出错时更麻烦。手动激活,路径清晰,至少知道问题出在哪一环。

5. 实战一把:在py3.7环境里装labelme并跑起来

5.1 为什么拿labelme举例

labelme是个老牌图像标注工具,在语义分割、目标检测的数据集制作里用得非常多。它恰好对Python 3.7兼容良好,安装过程能覆盖“创建环境、装包、启动应用”全链路,是个非常合适的实操例子。如果你手头没有其他老项目,拿它练手即可,跑通了能直观感受到conda环境隔离带来的好处:labelme装完只会待在labelme这个环境里,不会污染系统其他Python环境。

5.2 完整实操步骤

先创建环境并激活:

conda create -n labelme37 python=3.7 -y conda activate labelme37

然后安装labelme。官方推荐用pip安装,因为conda默认channel里的labelme版本更新不一定及时:

pip install labelme

国内网络环境慢的话,建议先把pip镜像配置好(前面讲过),然后启动:

labelme

正常情况会弹出labelme图形界面,第一次打开时旁边会带一个示例图像“lena.jpg”,界面上有“Open”“Open Dir”“Next Image”等按钮。能正常打开,就说明从conda到py3.7、到pip安装包、再到GUI应用的整条链路都是通的。

5.3 安装过程中的依赖坑

labelme依赖numpy、opencv-python、Pillow、PyYAML等一堆包。在py3.7下,这些包基本都有对应的预编译版本,pip安装一般顺畅。但如果你遇到opencv或numpy安装失败,多半是Python版本和环境不匹配,比如系统pip解析到了一个只支持新版Python的wheel。这时候可以尝试用conda安装这些重型依赖,conda会对二进制包做更好的兼容性匹配:

conda install opencv numpy pillow -y

然后再补装labelme。另外,如果pip install labelme时提示证书错误或者超时,检查一下是不是公司代理或者某个镜像源的问题,把global.index-url临时改成官方源:

pip install labelme -i https://pypi.org/simple

经验之谈:py3.7环境里装包,优先conda,conda没有再用pip,pip报错先用-i指定可用源,别急着去改系统配置文件。这个顺序能省掉一大堆排查时间。

6. 常见问题速查与避坑记录

6.1 高频报错:无法识别conda、需要conda init、命令找不到

这三类问题本质上都是“conda环境没初始化”或“PATH没配置”的变体。我做了一个速查表,方便直接对照。

症状根本原因解决方法
终端提示“无法将conda项识别为cmdlet”PATH未包含conda目录手动添加miniconda3和Scripts到Path,重开终端
激活环境提示需要conda initshell未配置conda初始化脚本执行conda init powershell或conda init cmd,重开终端
激活环境提示禁止运行脚本PowerShell执行策略限制Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
输入conda命令没有反应终端窗口还是老窗口关闭所有终端,重新打开后再试
激活后python版本仍不是3.7未在IDE里选对解释器用where python检查路径,并在IDE中指定py37解释器

真的是老生常谈,但每一条我都见人踩过,尤其是“重开终端”这一步,很多人忽略,导致conda init白跑了。

6.2 PackagesNotFoundError / UnsatisfiableError 的解法

创建环境时报PackagesNotFoundError,通常有两种原因:channel里没有这个版本,或者channel顺序不对。处理顺序是:先用conda search python确认版本是否存在;如果确认存在,再看配置的channel列表里有没有被精简掉历史版本;最后尝试添加conda-forge或清华源的free频道。

UnsatisfiableError更麻烦一些,表示依赖求解失败。常见于channel里两个包互相冲突。我的建议是:新建环境时不要用--override-channels过度限制channel,保持channel顺序稳定;遇到冲突先查看具体是哪些包版本互斥,实在不行就锁定小版本号,减少求解空间。老项目的依赖就是一团乱麻,能锁住的版本尽量锁住。

6.3 虚拟环境怎么迁移到D盘,四个方案对比

这个问题被问得特别多,尤其是C盘空间紧张的人。conda默认把环境放在C:\Users\你的用户名\miniconda3\envs\下,装多了确实吃空间。迁移到D盘有几种方案。

第一种,直接从创建时就指定位置,用--prefix参数:

conda create -p D:\envs\py37 python=3.7 -y conda activate D:\envs\py37

这样环境直接建在D盘,不占用C盘空间。注意,用--prefix创建的环境,激活时也要用完整路径,而不是环境名。

第二种,已有环境迁移。最稳妥的做法是先导出当前环境的依赖清单,再到新位置重建:

conda activate py37 conda env export > environment.yml conda create -p D:\envs\py37 python=3.7 -y conda env create -p D:\envs\py37 -f environment.yml

第三种,直接用conda create --clone复制到新位置:

conda create -p D:\envs\py37 --clone py37

第四种,直接把envs\py37整个文件夹复制到D盘。这种方法看着省事,但我不推荐,因为conda内部有些脚本和配置记录了环境路径,直接复制往往在激活时报错。实在要这么干,复制完后用conda activate D:\envs\py37激活,如果出问题,老老实实走重新创建+重装依赖的路子。

6.4 删除虚拟环境和清理缓存,顺手的事

环境建多了,删除就变成高频操作。删除虚拟环境用:

conda env remove -n py37

如果是用--prefix创建的环境,则:

conda env remove -p D:\envs\py37

删除前务必确认环境名没打错,因为conda删除环境不可恢复。另外,conda安装包时会在pkgs目录里留下大量缓存,积少成多,定期清理很有必要:

conda clean --all

这会清理所有索引缓存和下载缓存的安装包。我第一次跑这个命令时释放了将近3个G的空间。

6.5 其他坑:CondaHTTPError、代理、旧版conda

CondaHTTPError多数和网络有关。先看报错信息里的URL,如果指向的地址连接超时,最直接的解决方法是配置国内镜像源(前面给过命令),或者如果正处于代理环境下,检查代理设置是否影响conda访问。很多企业内网环境里,代理会导致conda请求被拦截,这时候要么配置conda的代理设置,要么临时关闭代理再试。

还有一个容易被忽略的问题是conda版本过旧。旧版conda在解析py3.7这类老版本时,可能会因为算法差异出现问题。升级conda本身不影响已经创建的环境:

conda update conda

清理完这些坑之后,py3.7环境基本就能安安稳稳用起来了。

最后说个我一直以来的习惯:建好环境的第一件事就是conda env export > environment.yml存个底,改坏了或者换电脑时直接conda env create -f environment.yml恢复。踩过几次环境崩掉的坑之后,我发现这个习惯是真的能救命。py3.7不是新东西,但让它在conda里安安稳稳跑起来这件事,值得一次归置到位。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/26 2:28:40

Clonezilla 实战:从 U 盘启动到 PXE 批量还原的完整指南

简介&#xff1a;这份资源是再生龙&#xff08;Clonezilla Live&#xff09;2.7.0-10 版 AMD64 架构安装镜像&#xff0c;面向需要进行系统克隆、数据迁移与灾难恢复的运维人员及个人用户。它类似 Ghost&#xff0c;支持 ext2/3/4、FAT、NTFS 等多种文件系统&#xff0c;兼容 W…

作者头像 李华
网站建设 2026/10/13 10:04:34

运放用作比较器:从开环原理到迟滞设计实战

做第一个光电计数器时&#xff0c;我把光敏电阻的电压变化先送进一级同相放大器&#xff0c;再把放大后的信号交给单片机ADC。直到后来想省一个引脚&#xff0c;才把另一枚运放直接当成比较器用&#xff1a;给阈值&#xff0c;输出高低电平&#xff0c;触发计数。结果发现&…

作者头像 李华
网站建设 2026/10/21 15:08:55

OpenClaw部署避坑指南:Node环境与npm/pnpm/cnpm核心区别解析

很多人第一次拿到 OpenClaw 的时候&#xff0c;都会被它那个“把 AI 接进本地工具链”的概念吸引&#xff0c;但真正动手部署&#xff0c;最先遇到的拦路虎反而不是模型配置&#xff0c;也不是 API Key&#xff0c;而是 Node 环境。我在 Windows、Ubuntu 甚至安卓 Termux 上都折…

作者头像 李华
网站建设 2026/10/14 23:04:15

IntelliJ插件开发上卷指南:从Gradle工程到Action与Tool Window实战

简介&#xff1a;这是一份面向 Intellij IDEA 插件开发者的系统手册上册&#xff0c;基于 JetBrains Runtime 17.0.9&#xff0c;适用于 IDEA 2023 及以上版本&#xff08;兼容 2024&#xff09;。手册从零讲解插件开发基础&#xff0c;梳理了 IDE 插件类型、开发环境要求、开发…

作者头像 李华
网站建设 2026/10/25 23:56:42

800G光模块选型实战指南:SR8/DR8/2FR4工程决策手册

1. 项目概述&#xff1a;为什么800G光模块正在从“可选”变成“必选”最近三个月&#xff0c;我连续跑了六家数据中心客户现场&#xff0c;有做AI训练集群的&#xff0c;有部署超大规模云原生平台的&#xff0c;也有在建新一代智算中心的。几乎每一家都在问同一个问题&#xff…

作者头像 李华
网站建设 2026/10/23 0:45:58

SpringBoot+Thymeleaf打造游戏百科系统:服务端渲染与数据建模实战

1. 技术选型的实际考量&#xff1a;为什么这套系统我没有走前后端分离 1.1 从"游戏百科信息系统"反推技术栈 这次的项目目标很明确&#xff1a;用 SpringBoot 基于 JavaWeb 技术栈做一套《战舰世界》游戏百科信息系统&#xff0c;把舰船资料、国家线、舰种分类、科技…

作者头像 李华