起因
在一台电脑上,可能有多个Python环境,每个环境都附带了大量的包,例如在我的mac上,就有macOS自带Python,homebrew所安装的Python以及Anaconda所附带的Python环境,管理起来非常混乱。
今日在完成CS50P作业时,发现我若在本地VS Code中import pytest,会被pylance报错为import "pytest" could not be resolved,甚是苦恼,故和ChatGPT对话良久,最终解决问题,先记录在这里,以免日后需要。这些内容零碎杂乱,遂不讲顺序直接分点列出。
叠甲:本人还没有搞懂这些问题的核心原理,仅作为解决问题的一次记录,不构成参考价值,如跟随本文执行命令导致出错,我不会也不将为你解答任何问题。
1. 如何更改使用的Interpreter
- 打开py文件,在VSCode右下角有一个显示Python版本号的地方,单击即可选择
- 在VSCode中,按下
command + shift + p或ctrl + shift + p
2. 如何查看当前终端环境下正在使用的Interpreter
- 在macOS/Linux下,在terminal执行
which python - 在Windows下,在cmd执行
where python
3. pip指令和Python Interpreter的关系
每个Interpreter负责自己所管辖的包,pip 安装的包只属于当前 Python 解释器对应的环境,不能直接在另一个解释器使用。举例来说,在homebrew/bin/python3解释器下使用pip install所安装的包并不能为anaconda/bin/python这个解释器所用
4. 什么是虚拟环境
虚拟环境相当于在所处项目下新建一个Python环境,用于和其他项目的Python环境所区分,主要是为了防止各个包版本不同而导致的污染(例如现有项目A和项目B,项目A使用pytest的3.1版本,项目B使用pytest的3.2版本,若不加以区分容易导致兼容性问题),虚拟环境可以理解为建立了一个「虚拟机」或「沙盒」,来防止污染问题。
新建一个虚拟环境并不会从建立前的解释器集成包,新建一个虚拟环境后立马执行pip list会发现只有pip一个包,所以每新建一个虚拟环境都需要重新部署各类包。
5. 如何新建一个虚拟环境
在当前目录新建一个虚拟环境
在命令行执行
1 | python -m venv . |
将会在当前项目目录新建一个没有显示名称的虚拟环境,该环境会被放到项目根目录的bin/或Scripts/文件夹中(前者为macOS/Linux,后者为Windows)
新建后需要将该虚拟环境激活:
在Windows上执行
1 | Scripts\activate.bat |
1 | Scripts\Activate.ps1 |
在macOS或Linux上执行
1 | source bin/activate |
此时再在终端执行which python或where python应该就可以看到处于一个新的Python环境中
新建一个自己命名的虚拟环境
在命令行执行
1 | python -m venv myenv |
将会在当前项目目录新建一个名为myenv的虚拟环境,myenv仅为示例,实际上可更换为你想要的任何合法名字,该环境会被放到项目根目录的myenv文件夹中
新建后需要将该虚拟环境激活:
在Windows上执行:
1 | myenv\activate.bat |
1 | myenv\Activate.ps1 |
在macOS或Linux上执行:
1 | source myenv/activate |
请注意,以上的指令都应将myenv替换为实际上为虚拟环境所起的名字。
此时再在终端执行which python或where python应该就可以看到处于一个新的Python环境中
安装完虚拟环境后,可先执行以下命令来将pip更新到最新版本
1 | python -m pip install --upgrade pip |
6. pip如何批量管理包
批量导入
新建一个虚拟环境后,可能需要快速导入一些包,此时可以在项目根目录新建文本文件requirements.txt并分行列出常用包,如:
1 | requests |
也可以指定版本,如:
1 | numpy==1.26.0 |
然后在终端执行以下命令即可安装指定包
1 | pip install -r requirements.txt |
实际上,txt文本文件名可以自定义,只需要执行指令更换为实际名称即可
批量导出
1 | pip freeze > requirements.txt |
相应的,执行以上指令会生成一个txt文本,列出当前虚拟环境所安装的所有包,txt文本名称依旧支持自定义
以上为修复问题过程中的一些记录,不构成任何参考。