Python虚拟环境
type
Post
status
Published
summary
虚拟环境的作用就是将不同项目所需的环境进行隔离,互不影响。虚拟环境的管理有很多方法,最常用的是使用condo来管理虚拟环境。
slug
python-virtual-environment
date
Apr 17, 2020
tags
虚拟环境
python基础
category
基础知识
password
icon
URL
Property
Feb 28, 2024 01:10 PM
一、为什么使用虚拟环境
- 不同项目可能使用的python版本不一样
- 不同项目使用的第三方包的版本可能也不一样
虚拟环境的作用就是将不同项目所需的环境进行隔离,互不影响。
二、虚拟环境配置和使用
推荐阅读:最全的Python虚拟环境使用方法
2.1、 使用conda管理
我目前在用的管理方式是miniconda,由于之前折腾过一段时间,所以摸索出了一些使用经验。
conda包管理工具有anaconda、miniconda、miniforge;前两个个人使用是免费的,miniforge是社区开源免费的。如果同时安装了miniconda和miniforge,则可以通过以下方法进行conda命令的切换:
切换命令
- 从 anaconda 切换到 miniforge:
../miniforge3/bin/conda init zsh
- 从 miniforge 切换到 anaconda:
../opt/miniconda3/bin/conda init zsh
注:文件路径需要根据自己的情况修改;
执行完上述切换命令之后记得重启 shell 才能成功切换(在vscode中需要手动中断中断(重新加载页面不管用))。
1. 安装
下载anaconda安装的python直接可以使用conda工具
更新congda
conda update -n base -c defaults conda
2. 创建虚拟环境
创建不同的python版本,直接写出版本号就好了,还可以同时安装想要的库。
创建虚拟环境时最好先指定python的版本,不然默认最新版本
conda create -n envname # 可能会创建空的环境(没有python,没有其他包) conda create -n envname python=3.9.0 # 指定python版本 conda create -n envname python=3.9.0 -c conda-forge # -c标志用于指定要使用的Conda通道。conda-forge是一个常用的第三方通道,提供了大量的开源软件包。 # arm64的mac不能安装3.8之前的python虚拟环境(镜像源中没有3.7之前的python包,换其他源也没有) # -c conda-forge的意思是新增以下两个路径去搜索python包 - https://conda.anaconda.org/conda-forge/osx-arm64 - https://conda.anaconda.org/conda-forge/noarch # 原路径是 - https://repo.anaconda.com/pkgs/main/osx-arm64 - https://repo.anaconda.com/pkgs/main/noarch - https://repo.anaconda.com/pkgs/r/osx-arm64 - https://repo.anaconda.com/pkgs/r/noarch # 有时候创建的虚拟环境没有 pip 等基础工具,这时我们在创建虚拟环境的时候可以直接指定我们需要的工具和版本,等环境创建好之后就直接安装好了。 conda create -n autoOffice pip=22.3.1
3. 激活虚拟环境
conda activate envname
4. 退出虚拟环境
# 不用加虚拟环境名字 conda deactivate
5. 删除虚拟环境
# 删除一个已有环境 conda remove -n envname --all
6. 更新安装包
pip list --outdated # 检查已安装包的最新可更新版本 pip list --outdated numpy # 不能单独检查numpy包的可更新版本,还是会列出所有包的最新可用版本。 pip install --upgrade requests # 更新单个包到最新版本 pip install -U requests # 更新单个包到最新版本(同上,简写) pip install -qU requests # 更新单个包到最新版本(-q是 --quiet 的缩写,表示静默模式) pip freeze | xargs pip install -U # 更新所有已安装包到最新版本 - pip freeze 列出所有已安装的包及其版本。 - xargs 将这些包名传递给 pip install -U,从而逐个更新这些包。 pip install requests==2.25.1 # 更新或倒退到指定版本 conda search --outdated # 检查已安装包的可更新的所有版本 - search会列出版本号和构建号,不用纠结构建号,直接安装想要的版本即可。 conda search numpy # 查找可用的numpy信息 conda list | grep numpy # 查看当前安装的numpy版本 conda update --all # 更新所有已安装包到最新版本 conda update numpy # 更新单个包到最新版本 conda install numpy=1.21.0 # 更新或倒退到指定版本
7. 其他有用指令
conda info -e # 列出系统存在虚拟环境 conda env list # 查看所有虚拟环境 conda list # 查看当前环境下已安装的所有包 conda list -n envname # 查看某个指定环境的已安装的所有包 conda create --name <NewName> --clone <OldName> # 克隆一个不同名字、但包相同的环境 # 安装package conda install -n venv numpy # 指定虚拟环境安装numpy,在虚拟环境内部可以不指定name,也可以通过-c指定通过某个channel安装 pip install -r requirements.txt conda install --yes --file requirements.txt # 批量安装;--yes无需用户确认自动回答"yes";--file读取文件安装。 conda install langchain -c conda-forge # -c指定要使用的Conda通道。conda-forge是一个常用的第三方通道,提供了大量的开源软件包。 # 虚拟环境重命名 conda create -n new_name --clone old_name # 先克隆一份原环境 conda remove -n old_name --all # 删除原环境 pip show sqlalchemy # 查看安装包详细信息
8、conda clean
conda clean --all 是一个用于清理 conda 缓存的命令。s
- 下载的包缓存 (pkgs):删除 ~/conda/pkgs 目录下已下载但未使用的包
- 索引缓存 (index-cache):删除包元数据索引缓存
- 锁定文件 (lock):删除所有 conda 锁定文件
- 包缓存 (tarballs):删除压缩包缓存
- 未使用的包缓存(packages):删除未被任何环境使用的包
命令安全性:
- 这个命令是完全安全的,不会影响已经创建的虚拟环境
- 它只清理缓存文件,不会删除已安装的包或现有环境
- 清理后,如果需要重新安装包,conda 会重新下载必要的文件
更精确的清理选项:
- conda clean --index-cache # 只清理索引缓存
- conda clean --packages # 只清理未使用的包
- conda clean --tarballs # 只清理压缩包缓存
- conda clean --lock # 只清理锁定文件
使用建议:
- 当遇到包安装问题时
- 当硬盘空间不足时
- 当需要解决包冲突时
- 定期清理以维护系统整洁
2.2 试用Python自带的 venv 管理
python3 -m venv venv # 在当前目录创建名为 venv 的虚拟环境 python3.9 -m venv venv # 创建时指定 Python 版本(需要先安装对应python版本) source venv/bin/activate # 激活虚拟环境,激活后命令行前会显示 (venv),表示当前在虚拟环境中 pip list # 查看已安装的包 pip install package_name # 安装包 pip install package_name==1.0.0 # 安装指定版本 pip install -r requirements.txt # 批量安装依赖 pip freeze > requirements.txt # 导出依赖列表 pip install --upgrade pip # 更新 pip deactivate # 退出虚拟环境 rm -rf venv # 删除虚拟环境:直接删除虚拟环境文件夹即可
2.3、使用poetry管理
安装和初始化
使用poetry管理项目首先需要对项目进行初始化,如果是对已有项目进行初始化则使用
poetry init
,如果是需要新建一个项目则使用 poetry new project_name
;新建项目会生成对应的项目目录和pyproject.toml
文件,poetry init
只会创建 pyproject.toml
文件,不会生成其他目录结构。pyproject.toml 文件,包含:1、项目基本信息(名称、版本、描述等);2、Python 版本要求;3、依赖管理配置。# 安装 poetry curl -sSL https://install.python-poetry.org | python3 - # 在现有目录中初始化 Poetry 项目;只会创建 pyproject.toml 文件,不会生成其他目录结构。 poetry init # 创建新项目 poetry new project_name # 1、 自动生成标准的 Python 项目结构 project_name/ ├── pyproject.toml # Poetry 的项目配置文件,包含项目信息和依赖 ├── README.md # 项目说明文档 ├── project_name/ # 源代码目录 │ └── __init__.py # Python 包初始化文件 └── tests/ # 测试目录 └── __init__.py # 测试包初始化文件 # 2、 创建 pyproject.toml 文件,包含: # - 项目基本信息(名称、版本、描述等) # - Python 版本要求 # - 依赖管理配置 # 3、 初始化 Git 仓库(如果目录中没有)
环境管理
项目初始化完成后进行虚拟环境管理;第一次执行
poetry shell
时会:1、检查是否存在对应的虚拟环境;2、如果不存在,则创建新的虚拟环境;3、然后激活这个新创建的虚拟环境。以后执行 poetry shell 时会:直接激活已存在的虚拟环境;在首次执行
poetry shell
创建虚拟环境时不需要手动设置名称,Poetry 会自动处理。poetry shell # 创建/激活虚拟环境 exit # 退出虚拟环境 poetry env info # 显示虚拟环境信息 poetry env list # 列出所有虚拟环境 poetry env remove python3.9 # 删除指定虚拟环境 poetry env use python3.9 # 使用指定 Python 版本创建环境
依赖管理
依赖分组管理
[tool.poetry.dependencies] python = "^3.8" requests = "^2.28.0" [tool.poetry.group.dev.dependencies] pytest = "^7.0.0" black = "^22.0.0" [tool.poetry.group.docs.dependencies] sphinx = "^4.0.0"
# 依赖安装 poetry install # 安装 pyproject.toml 中定义的所有依赖 poetry install --no-dev # 只安装主依赖,不安装开发依赖 poetry install --with docs,test # 只安装特定组的依赖 poetry install --without dev,docs # 排除特定组的依赖 # 版本控制 poetry add requests==2.28.0 # 指定精确版本 poetry add "requests>=2.28.0,<3.0.0" # 指定版本范围 poetry add "requests^2.28.0" # 使用 ^ 表示兼容性版本;等同于 >=2.28.0,<3.0.0 poetry add --dev requests==2.28.0 # 添加开发依赖 # 依赖锁定 poetry install --sync # 严格按照 poetry.lock 文件安装依赖,确保版本完全一致 poetry install --sync --remove-untracked # 删除不在依赖列表中的包 # 依赖导出 poetry export -f requirements.txt --output requirements.txt # 导出 requirements.txt poetry export -f requirements.txt --with dev --output requirements.txt # 包含开发依赖 # 依赖更新策略 poetry update requests # 更新单个包 poetry update # 更新所有包到最新兼容版本 poetry show --outdated # 查看过期包 # 移除依赖 poetry remove requests==2.28.0
项目管理
poetry run python script.py # 运行命令 poetry build # 构建项目 poetry publish # 发布到 PyPI
配置管理
poetry config --list # 显示配置 poetry config virtualenvs.in-project true # 设置配置
参考链接:
三、vscode相关的虚拟环境问题
3.1、在 vscode 中如何选择虚拟环境
方法一:
- command + shift + P
- python:select interpreter
- 选择特定虚拟环境
方法二:
直接点击页面最下边的这个位置,也会弹出选择框

3.2、在 vscode 中显示双层虚拟环境
默认会出现双层虚拟环境,如下图

原因:vscode 中的 python 插件和 conda 之间的冲突,两者都会自动激活虚拟环境。
解决方法:关闭其中一个自动激活
具体操作:
# 关闭 conda 的自动激活 conda config --set auto_activate_base False
四、虚拟环境的包转移
4.1、使用.txt文件转移
4.1.1、导出
方法一:pipreqs(推荐)
原理是先扫描代码文件,看代码中导入了哪些包,然后将对应的包及版本导出。
# 安装 pip install pipreqs # 导出 pipreqs ./ --encoding='utf-8' --force --scan-notebooks pipreqs ./ --encoding='utf-8' --force --ignore .history --scan-notebooks # 扫描时忽略 .history 文件 pipreqs ./ --encoding='utf-8' --force --ignore .history,venv,env # # 忽略多个文件夹 pipreqs ./ --encoding='utf-8' --force --ignore ".history,venv,env,__pycache__,logs,data" """ ./:表示扫描当前目录(默认只会扫描.py文件), --encoding:生成文件的编码方式 --force 强制执行,目录下已经存在requirements.txt时覆盖 --scan-notebooks:扫描 .ipynb 文件 """
遇到的问题:
- 扫描出来的问价内是空白:因为项目文件是 .ipynb 文件,需要在最后加参数:--scan-notebooks
pipreqs ./ --encoding='utf-8' --force --scan-notebooks
- 会扫描历史文件,可能导致报错,应该忽略
.history
文件夹
pipreqs ./ --encoding='utf-8' --force --ignore .history --scan-notebooks
方法二:freeze
通常情况下,我们一般使用以下命令导出 虚拟环境中的三方包:
pip freeze > requirements.txt
使用上述方法的话,有时导出的依赖会包含 @file 路径,如果继续使用
pip install -r requirements.txt
命令来安装这些依赖的话会报错;所以在导出三方包的时候可以使用一下命令:
pip list --format=freeze > requirements.txt
注意:使用上述命令时,会将
distribute
, pip
, setuptools
和 wheel
也一并导出,建议手动删除上述四个依赖。二者的区别
freeze:
- 列出当前 Python 环境中所有已安装的包及其版本;直接从虚拟环境中读取已安装的包信息
- 优点
- 准确性高,版本号精确
- 操作简单直接
- 能捕获所有依赖包的具体版本
- 缺点
- 会包含很多项目不需要的依赖
- 包含间接依赖(依赖的依赖)
- 如果环境中安装了其他项目的包,也会被一并记录
pipreqs:
- 通过静态分析项目代码中的 import 语句;只生成项目实际使用到的包的列表
- 优点
- 只包含项目实际使用的包
- 更清晰、精简的依赖列表
- 适合生成项目特定的依赖
- 缺点
- 可能会遗漏一些动态导入的包
- 有时无法准确判断包的版本号
- 对复杂的导入语句可能识别不准确
4.1.2、安装
在其他环境安装
requirements.txt
中的包时,可以使用pip方法pip install -r requirements.txt
也可以使用conda方法:
conda install --yes --file requirements.txt
详细使用教程草考: 使用conda安装requirement.txt指定的依赖包
4.2、使用.yml文件方式转移
将旧环境的包打包成.yml文件
conda env export > freeze.yml
用.yml文件创建新环境
conda env create -n spider1 -f freeze.yml