你刚开始学 Python 的时候,是不是也被各种包依赖、版本冲突搞得头大?明明昨天还能跑的代码,今天换个环境就报错。这太正常了,我刚开始自学那会儿也这样,直到我搞懂了虚拟环境这个概念,整个人才通透了起来。今天就把我压箱底的经验掏出来,聊聊自学 Python 路上,为什么建议你用 Miniconda 来搭建自己的虚拟环境,以及到底怎么用它,把环境管理这块彻底焊死。
如果你是刚接触编程的自学者,或者写过一阵子代码但一直被环境问题折磨,这篇文章就是为你准备的。我会从虚拟环境的原理讲起,一直讲到实际操作中那些非技术文档里才会提到的坑和技巧,帮你在 Python 自学的路上少走弯路。
1. 虚拟环境到底是个啥?为什么 Python 自学之路必须要过这道坎
1.1 先从最让人头大的包冲突说起
要知道虚拟环境是干嘛的,咱得先看看没有它的时候,Python 开发会乱成什么样。你知道吗,Python 的标准库是有限的,你要做数据分析得装pandas、numpy,要做网页得用flask或者django,这些第三方包默认都会被装到一个全局的目录里去,也就是你安装 Python 时给定的那个site-packages目录。
这个看似简单的设计,在项目复杂起来之后就会变成噩梦。假设你手头有个老项目,用的是Django 2.0,另一个新项目呢,非得用上只有Django 4.2才有的新特性。两个项目跑在同一个机器上,全局环境里只能存在一个版本的 Django。你装上 4.2,老项目代码跑不起来;你装回 2.0,新项目的代码又崩了。这种痛,不少自学者在作业或毕设阶段都体会过。
再有就是权限捣乱。在公共的服务器或者某些 Linux 环境下,你没有管理员权限,全局安装任何 Python 包都可能被系统拒绝。哪怕你就在自己的 Windows 电脑上,全局环境装了一堆杂七杂八的包,时间长了,环境就变得脏乱差,你自己都记不清哪些包属于哪个项目。
1.2 用生活化的类比理解虚拟环境
虚拟环境就是为了解决上面这些破事而生的。你可以把每一个项目想象成要举办一场不同的派对,每个派对需要不同的酒水、饮料和音响设备(也就是不同版本的 Python 和第三方库)。没有虚拟环境,就像所有派对都挤在同一个仓库里,东西全都混在一起存放,你办完 A 派对,再办 B 派对的时候,不仅找东西费劲,还容易拿错。
有了虚拟环境,你就相当于给每个派对单独租了一个独立房间。每一个项目关起门来,自己在自己的房间里折腾,用的 Python 版本、安装的包,都是独立的,彼此之间互不干扰。在此基础之上,Miniconda 干的事就更进一步了,它不光能帮你创建这些独立的房间,还自带一个“房间管理总台”,让你可以快速创建、切换、销毁任意一个房间,非常方便。
1.3 为什么是 Miniconda,而不是 Anaconda 或者直接装 Python
说到这,在很多知乎推荐帖或者 Python 教程里,你可能都见过 Anaconda 这个名字。它确实也是个很好用的工具,一装就是几百个常用的数据科学包,省去了自己挨个安装的麻烦。但它的问题也很明显,就是体积太大、太重了。一个干净的 Anaconda 安装完之后,动辄几个 GB 的空间占用,而且因为预装了大量你可能这辈子都用不上的包,日常运行也显得有些臃肿。
对于自学者来说,初期涉及的第三方库其实很有限,无非就是requests、numpy、pandas、matplotlib这些。用 Anaconda 这种“全家桶”方案,多少有点杀鸡用牛刀。而 Miniconda 就不一样了,它才是 Conda 这套强大包管理系统的“最小化可用版本”。Miniconda 只带一个基本的 Python 解释器和 Conda 管理工具,体积往往只有几百 MB,非常轻量,就像一个养精蓄锐的基础兵营,你需要什么兵种(库),随时用 Conda 命令现调现装,想精装哪个就精装哪个,灵活性和可控性都高出一截。
所以说,我的个人建议非常明确,如果你的电脑配置不算顶级,或者你只是想专心学习 Python 本身,直接选 Miniconda 就对了。它把你从无尽的包依赖地狱中拯救出来,同时也保持了你开发环境的干净清爽。
2. 环境管理第一步:Miniconda 的获取与安装避坑指南
2.1 下载安装包的正确姿势
既然确定了要装 Miniconda,那咱就认真把它装好。这一步看似简单,其中却是暗藏不少坑,如果你是在国内网络环境下学习,就更是要注意了。
第一,别去乱七八糟的网站下载 Miniconda 安装包,一定要认准官方渠道。官方下载入口的地址其实很好记,就是 Python 生态里的老熟人conda.io或者直接搜索 Miniconda 下载页面。你进入之后会看到一个大列表,里面一排都是安装包。
这里千万要注意,选择安装包的时候,一定要看清楚系统版本和架构类型。你要搞清楚自己的电脑是 Windows、macOS 还是 Linux,还要搞清楚 CPU 是 64 位(x86_64)还是 ARM 架构(arm64或者aarch64)。特别是现在不少新电脑,尤其是 Apple 芯片的 Mac,如果不小心下载了 x86 版本,虽然也能跑,但性能上有损耗,后边装包的时候还可能出现特异问题,那就得不偿失了。一般情况下,Windows 用户认准带有Windows-x86_64.exe字样的安装包即可;Mac 用户还要区分一下芯片,苹果 M1/M2/M3 芯片就选带有arm64字样的那个,Intel 芯片的 Mac 就选x86_64的.pkg或者.sh。
第二,国内网络环境下,下载安装包本身的速度可能还凑合,但真正让人崩溃的是安装完成后,配置默认软件源时那个龟速。不过这个我们放到第五章重点讲,现在先忍一忍。
2.2 详细安装过程实录
安装过程中也有不少小细节,值得好好说说。
以 Windows 为例,你双击下载好的.exe安装程序,一路点 Next,整个过程其实挺傻瓜的。但有几个关键的岔路口,请一定注意:
- 在选择安装类型的界面,建议选择Just Me(仅为我安装)。除非你有特殊的多人共用电脑的需求,否则只为你当前用户安装是最省事的,避免了后期因为权限问题导致环境创建失败。
- 在高级设置界面(Advanced Options),你会看到两个复选框。默认情况下,电脑会提议把 Miniconda 添加到系统 PATH 环境变量里,亿点点建议你,除非你真的特别懂,否则不要勾选“Add Miniconda3 to my PATH environment variable”。这听起来有点反直觉,但这是为了避免 Miniconda 自带的 Python 和你电脑上原来就有的其他 Python 解释器打架。安装完之后,我们直接用 Anaconda Prompt 这个专用命令行终端来操作,就够了。
- 紧随其后那个“Register Miniconda3 as my default Python”的选项,主要针对的是让你系统里装的 IDE(比如 PyCharm)能够自动识别到 conda 环境里的 Python。这个可以视情况而定,如果你以后打算长期用 PyCharm,勾上也无妨;如果你习惯用 VS Code 手动指定解释器,也可以不勾。我自己反正是没勾的,因为我更喜欢手动控制在哪个 IDE 里到底用哪个解释器。
如果你是 macOS 或者 Linux 玩家,安装就更好办了。拿到.sh文件之后,在终端里执行bash Miniconda3-latest-MacOSX-arm64.sh,然后按照屏幕提示一步步输入yes确认即可。唯一需要注意的一点是,安装过程中它可能会问你,是否希望conda init来初始化你的 shell,这里记得输入yes。因为只有初始化了之后,你才能直接在普通终端里使用conda命令,否则每次都要手动去用绝对路径找conda可执行文件,那可太折磨人了。
2.3 安装完成后必做的第一件事
装完 Miniconda,打开命令行或终端,敲入conda --version,如果能看到类似conda 23.x.x之类的版本输出,恭喜你,万里长征第一步算是走踏实了。
但是,这离可以舒舒服服地创建虚拟环境还有一步之遥。因为默认的软件源(也就是 Conda 去哪下载 Python 包)在国外,用起来极其难受。解决掉这个痛点的具体操作我们放在后面的“镜像源配置技巧”章节来讲,你可以先在这打个标记,稍微耐心往下看。
3. 新手必看:用 conda 创建并初始化一个虚拟环境的完整操作
3.1 核心命令家族与运行逻辑
好,到了整个项目的核心了。就是下面这几个命令,学会了它们,你基本就掌握了 Conda 的日常精髓。
创建虚拟环境的命令格式是:
conda create -n myenv python=3.10这里先拆解一下每个部分的含义:conda create是创建命令的主干,-n myenv是给这个新环境取个名字,叫myenv(你可以随意换成任何你喜欢的,比如pyjango或者demo_env,没有硬性规则,唯一的要求是不要用特殊符号和中文,不然一部分命令行工具可能识别不了)。后半截python=3.10则是告诉 Conda,请在这个环境里创建一个版本为 3.10 的 Python 解释器。
回车之后,系统会花几秒钟时间分析依赖关系,然后显示一个安装计划列表,告诉你“我要装这么一堆东西”,最后会问你是不是确认[Y/n],输入y再敲回车,剩下的就交给网络了。
这里有一个非常容易让新手摸不着头脑的点:创建并激活环境,其实是两步操作。conda create只是把环境造好了,但你当前仍然处于base环境里。想要进去用,必须执行:
conda activate myenv一旦激活成功,注意看你的命令行终端左下角,它会在之前的路径或者用户名前面,多出一个(myenv)的小括号标记。只要看到这个小括号了,就说明你正在这个虚拟环境内部作业。
3.2 不同阶段你需要什么样的 Python 版本
作为自学者,你可能心里会犯嘀咕:“我要创建的环境,到底该选哪个 Python 版本呢?”
我的经验是,初期不要盲目追求最新。Python 版本迭代很快,但第三方库的跟进速度往往有延迟。要是你当前学习的课程或项目中没有特殊要求,我强烈建议你选一个被生态广泛欢迎、稳定可靠的老版本,比如3.9或3.10。这两个版本的兼容性极佳,几乎你接下来两三年内能接触到的主流第三方库,都能在这两个版本上顺畅运行。
如果只是自己随便写着练习,你也可以用conda create -n basic python这样的命令。不带版本号的话,Conda 会自动为你选择当前源中可用的最新稳定版本。但是,如果你是在为一个已有的实战项目搭建环境,那就要老老实实看清项目的requirements.txt或者pyproject.toml里声明的 Python 版本范围,依葫芦画瓢,不然很容易在后期跑起来时遇到莫名的版本坑。
3.3 创建、激活、退出与销毁的日常操作清单
为了让你更直观地把这套流程串起来,这里立一份完整的操作清单。
- 打开 Anaconda Prompt(Windows)或者你的普通终端(Mac/Linux)。
- 用
conda create -n my_first_env python=3.9创建你人生中第一个受控的虚拟环境。 - 出现确认提示后输入
y,等待“done”字样出现。 - 执行
conda activate my_first_env进入环境,确认终端左侧出现(my_first_env)。 - 执行
conda install numpy pandas matplotlib安装你常用的一批数据科学包。如果网络慢,参考后面镜像源章节。 - 干完活之后,执行
conda deactivate退出当前环境。 - 哪天你要是觉着这环境没用了,想腾出空间,先退出,然后执行
conda remove -n my_first_env --all把它彻底抹除。
这套流程就是整个 Conda 环境管理的日常,基本每天你要跟它们打好几次照面。
4. 进阶实操:在自定义虚拟环境中安装包和管理依赖
4.1 conda install 与 pip install 的选择悖论
当你处于一个激活的虚拟环境中,安装第三方库有两个最主要的渠道:conda install和pip install。
这时候新手最常问的一个问题就是“我到底用哪个?”我的实际经验是,能用conda install的,就用conda install。因为 Conda 内置了高级的依赖解析能力,它不光是针对 Python 包,还管到了非 Python 的动态库文件,比如 C 库、CUDA 加速库等等。尤其你在维护一些跟深度学习相关的环境时,用conda install装pytorch、tensorflow这一类硬骨头,成功率远比直接pip install要高得多,因为它连底层的驱动库都替你考虑好了。
不过,宇宙的尽头,终究还是 pip。因为有不少冷门包或者某个项目官方只支持通过pip发布。所以 Conda 与 pip 并存的局面属于常态。你只需要记住一条黄金法则:先试着用 conda 装,conda 装不上的再用 pip,装完务必留意是否有环境依赖被破坏的警告。
我个人还要再提醒一句,千万别在同一环境里混用conda install和pip install去装同一个包的不同版本。那样不仅会让 Conda 的依赖解析如同踩进泥潭,甚至可能在之后的某个时间点造成难以安抚的崩溃。
4.2 从环境文件恢复与迁移环境——自学者最实用的快捷键
自学路上,有时候你会重装系统,或者换了台新电脑,旧环境的安全搬迁就成了刚需。这就得用上环境导出这个绝活。
在当前环境激活状态下,输入:
conda env export > environment.yaml运行完,当前目录下就会多出一个environment.yaml文件。这个文件里不仅记录了包的名字和版本号,还记录了这些包的来源渠道。你把它带到新电脑上,执行:
conda env create -f environment.yamlConda 就能按图索骥,一键重建一个一模一样的虚拟环境。这项技能在毕业设计交接、或者跟别人协同开发的时候,简直救大命了。谁用谁知道。
如果你不想保留环境的历史记录和那些非必须的构建信息,也可以用conda env export --from-history,导出一个精简了许多的平台无关版本。不过这个操作会丢掉非 Python 的包记录,在迁移之后偶尔会有点小意外。稳妥起见,还是推荐使用完整的conda env export。
4.3 常用辅助管理命令速查
除了创建和安装,你还需要去查看、复制、甚至克隆环境。这几个命令出现频率很高,但很多新手到了用的时候就叫不上名字,这里一并写清楚。
- 查看环境列表:
conda env list或者conda info --envs。它会列出一堆路径,最后带个*号的就是你当前所在的环境。 - 查看当前环境装了哪些包:
pip list或者conda list。前者更贴近程序员习惯,后者会更全。 - 复制一个环境作为备份:
conda create -n new_env --clone old_env。这是一个绝佳的备份手段,在动手改动大工程之前,给整个环境做个克隆,然后随便造,出问题再回来,非常安心。 - 更新某个包:
conda update package_name。 - 删除某个包:
conda remove -n env_name package_name。
是不是看起来也就那三板斧?没错,Conda 表面上的东西真的不多,但这套东西练熟了,能让你在自学的路上走得镇定得多。
5. 那些官方教程绝口不提的“操作禁忌”与镜像源配置技巧
5.1 慢到怀疑人生的下载速度,多半是源没配好
前言里埋了个伏笔,关于国内网络环境的坑,现在专门提出来聊一聊,毕竟几乎每个刚接触 Miniconda 的自学者,都会在上面栽个跟头。
当你执行conda create或者conda install时,如果命令行界面像老牛拉破车一样,网速显示只有几十 KB/s,甚至直接“卡死”,那十有八九是在连接默认的官方源。解决办法也很简单,就是换成国内的镜像源。
以国内较知名的某开源软件镜像站为例,你只需要在命令行里执行以下几句命令,把 Conda 的默认下载地址替换即可:
conda config --add channels https://mirrors.cloud.tencent.com/anaconda/pkgs/main conda config --add channels https://mirrors.cloud.tencent.com/anaconda/pkgs/free conda config --set show_channel_urls yes像这种类似的镜像地址还有很多,像是清华源、中科大源等,都是非常好的选择。具体地址哪怕是像现在这样,过一段时间会有些微调,原理都是一样的。建议你用哪个稳定,就一直用着。如果中途发现某一条源失效了,也可以简单粗暴地通过编辑用户目录下的.condarc文件来删除或修改。
配好镜像源之后,再次执行创建环境的命令,你会发现速度有了质的飞跃,操作起来舒适多了。真的,要是没配源,你连conda install numpy这种小事都会等到怀疑人生。
5.2 环境命名原则与“绝不污染基础环境”的执念
很多自学新手,会习惯性地把一开始的base环境当作主战场,在里头一通操作,装各种包。我刚开始也干过这事,直到后来整个基础环境被我搞得一塌糊涂,很多包因为版本冲突越修越乱,最后只能含着泪推倒重来。
踩过这次坑之后,我给自己定下一条铁律:“base”环境绝对不装任何项目依赖的第三方包。它存在的唯一意义,就是作为一个干干净净的 Conda 总入口,用来创建和管理其他独立的虚拟环境。
进一步的,命名环境的时候,也要讲究一点章法。别老是起test1、new2这种名字,后边你环境多了根本分不清哪个是哪个。推荐用“项目名+用途”的组合。比如你在做一个爬虫项目,可以叫crawler_scrapy;在做数据分析,就叫analysis_pandas。这样时间久了,一眼望去清清楚楚。
5.3 更换 Python 版本时,容易被忽略的小秘密
这里有个来自实战的小偏方。如果你不小心把某个环境里的 Python 版本搞坏了,或者想升级,但又不想重新创建环境,也是有捷径的。直接在环境激活状态下执行:
conda install python=3.11Conda 会忠实地为你解析当前环境下,所有已安装的包跟目标 Python 版本之间的兼容性,并自动重装部分依赖。这一步非常强大,完全不需要你手动把环境删掉重建。不过要注意,这种原地换版本的操作,对依赖解析压力很大,耗时通常比较久,也可能遭遇偶尔的冲突。真到那种情况,新建环境并迁移依赖才是上策。
6. 从命令行走向 IDE:在 PyCharm 和 VS Code 里无缝切换环境
6.1 为什么自学者必须让 IDE 认识你的虚拟环境
光在命令行里能用虚拟环境还不够,因为说实话,初学 Python 的时候,你大概率还是会在 PyCharm 或者 VS Code 里按着绿色小三角跑脚本。这时候最大的困惑就是:明明我在命令行里激活了环境,怎么在 IDE 里一跑还是用的老解释器?
这是因为 IDE 默认会绑定你自己在系统里定义的那个 Python 解释器,跟 conda 的环境完全是两码事。因此,让 IDE 认识我们刚创建的 Conda 虚拟环境,就成了自学者跨越到半专业水准的重要一步。这一步并不复杂,核心就是在 IDE 设置里选择conda环境对应的 Python 解释器路径。
6.2 PyCharm 里直接调用的操作路径
如果你用的是 PyCharm,点击界面右下角或者左下角的状态栏,那个地方通常显示着当前 Python 解释器版本。在弹出的菜单里选择Add New Interpreter,然后再选Add Local Interpreter。
继续往下看,在左侧栏里找到Conda Environment,这里有两种选择方式:一是点击Existing environment,然后从下拉列表里精准挑出你需要用的那个环境;二是直接指定 conda 可执行文件和你创建环境后生成的那个python.exe文件路径。弄好之后点确定,PyCharm 底部就会重新加载索引,等它转完圈,你再看解释器,已经是虚拟环境里的那个了。
6.3 VS Code 里极其重要的选择解释器命令
VS Code 的操作也类似,不过它的入口稍微隐蔽一点。在 VS Code 的编辑界面右下角,你可以看到一个 Python 版本号显示(例如Python 3.10.0)。点击它,弹出灵通列表,在顶部输入框中,会神奇地自动带出你在 conda 环境创建过的解释器列表。选一个,VS Code 右侧底部的状态栏就会显示当前解释器路径。
如果不小心没看到你想要的那个环境,也可以点设置按钮手动把 conda 的python.exe的绝对路径输进去。这样无论是调试还是运行,代码都会安静地跑在你指定的虚拟环境里,不会再跟你本机的其他 Python 发生任何冲突。
7. 自学路上最常踩的坑:conda 命令报错与解决实录
7.1 “Conda is not recognized” 是什么意思
在新手的操作系统里,输入conda命令却得到"conda 不是内部或外部命令"的报错,这种情况出现的概率很高。遇到它,别慌,这不是 Miniconda 没装好,大概率是因为你没有在正确的终端里启动它。
Windows 用户注意了,快捷键搜索到Anaconda Prompt并且通过它来操作,这个专用终端自带环境变量初始化。要是用 CMD 或者 PowerShell 直接敲conda,报这个错是完全正常的。如果你非得在普通终端里用,那就要去系统环境变量里,手动把 Miniconda 安装目录下的Scripts文件夹路径和Library\bin文件夹路径给加进去,否则系统根本不知道去哪里找 conda 命令。
7.2 “Solving environment” 卡住不动的深层原因
Solving environment阶段长时间不结束,是 Conda 的一大特色场景。这通常发生在依赖关系非常复杂的包(比如pytorch、tensorflow)或者多个源同时参与解析的时候。
如果真的卡死了,我一般会直接按Ctrl + C终止它,不要有太多留恋。然后以上四种手段轮流上阵:要么检查一下是不是网络问题,更换稳定性更好的镜像源;要么就用conda install指定一个大版本号范围,像conda install pytorch=2.0,来减少解析范围;要么干脆直接用pip install绕过 Conda 的解析流程;实在不行,新建一个环境从头再试。
7.3 镜像源地址失效后的自我修复
用了一阵子镜像源之后,某天你再创建环境,突然发现终端报出 403 或 404 错误,那种酸爽确实不好受。遇到这类问题,常见的原因就是你之前配置的镜像仓库有了调整或者分层结构有变化。
处理方法很简单,先执行conda config --remove-key channels,把之前写入的渠道全部清空,返回官方默认源。然后重新根据当前官方给出的最新公告,把可用的新地址再次加回来。养成定期检查源是否正常的习惯,真的能少受不少罪。
7.4 环境导出后恢复时总是出现不兼容的终极对策
这个坑我也踩得比较深。用conda env export导出的环境文件,在另外一台电脑或者另外的操作系统上恢复时,经常会莫名其妙地报一堆“packages not available”的错误。问题的根源就在于这个文件里记录了很多本地构建的哈希信息,平台一变,这些统统对不上号。
这时候,我建议执行一种降级方案:先老老实实conda create -n new_env python=3.10,把基本环境建好,然后在这个新环境里直接执行pip install -r requirements.txt。这要求你从一开始就在项目里用pip freeze > requirements.txt来维护一份干净的纯 Python 依赖清单。但要注意,pip freeze会把你当前环境里所有的包全部输出,哪怕是你后来为了干杂活装的工具包也会整个列进去,所以严谨一点的人会使用pipreqs这个工具,让它只扫描你项目代码里真正 import 到的东西。这样导出的依赖文件干净、可移植性极强,是跨环境协作的神兵利器。
8. 写在最后的个人小总结
我从不管这叫“最佳实践”,因为环境管理这条路,每个人有每个人的走法。但经过了这么多年的折腾,我得出的唯一经验就是:工具只是辅助,条理才是王道。Miniconda 的哲学很简单,就是让你用最少的存储空间,换取最大的环境管理自由。你不用成为 Conda 的专家,只需要掌握create、activate、install、deactivate、export这几个命令,就已经能应付掉自学Python路上九成以上的项目需求了。
以后写代码之前,先建环境,再写代码,这个肌肉记忆一定要练出来。从一开始用 Miniconda 管理虚拟环境,到逐渐适应多环境并行、依赖导出、镜像源切换等一整套现代 Python 项目管理思路,你会发现自己写代码的心态都变得越来越稳。最后说一句,自学路上遇到环境问题别上头,把它当成是一种练手,踩过一次坑,你就再也不会掉进同一个坑了。