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版本不一样
  • 不同项目使用的第三方包的版本可能也不一样
虚拟环境的作用就是将不同项目所需的环境进行隔离,互不影响。

二、虚拟环境配置和使用

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. 其他有用指令

# 列出系统存在虚拟环境 conda info -e conda env list # 查看当前环境下已安装的包 conda list # 查看某个指定环境的已安装包 conda list -n envname # 查找package信息 conda search numpy # 克隆一个不同名字、但包相同的环境 conda create --name <NewName> --clone <OldName> # 安装package conda install -n venv numpy # 指定虚拟环境name安装numpy,如果是进入到虚拟环境内部可以不指定name,也可以通过-c指定通过某个channel安装 conda install --yes --file requirements.txt # 批量安装;--yes选项表示在安装过程中自动回答"yes",无需用户确认。--file选项后面指定了一个文件名,文件包含了软件包的列表,每个软件包一行。 conda install langchain -c conda-forge # -c标志用于指定要使用的Conda通道。conda-forge是一个常用的第三方通道,提供了大量的开源软件包。 # 下面这几个命令没试过, # 安装txt文件中的包;如果requirements.txt中的包不可用,则会抛出“无包错误” while read requirement; do conda install --yes $requirement; done < requirements.txt # while read requirement; do conda install --yes $requirement || pip install $requirement; done < requirements.txt # 在conda命令无效时使用pip命令来代替 pip install -r requirements.txt # 更新package conda update -n venv numpy # 删除package conda remove -n venv numpy # 重命名 conda create -n new_name --clone old_name # 先克隆一份原环境 conda remove -n old_name # 删除原环境

2.2、使用virtualenv

1. 使用pip

pip install virtualenv

2. 创建运行环境

virtualenv [虚拟环境名称] virtualenv venv #如果不想使用系统的包,加上–no-site-packeages参数 virtualenv --no-site-packages 创建路径名
📌
virtualenv只能指定已经安装的python版本来创建虚拟环境,conda可以直接指定未安装的python版本创建虚拟环境。

3. 激活环境

linux:
$ cd venv $ source ./bin/activate
Windows 10:
> cd venv > .\Scripts\activate.bat

4. 退出环境

linux: $ deactivate
Windows 10: > .\Scripts\deactivate.bat

5. 删除环境

没有使用virtualenvwrapper前,可以直接删除venv文件夹来删除环境

6. 使用环境

进入环境后,一切操作和正常使用python一样,安装三方包使用pip install

2.3、使用Virtualenvwrapper

Virtaulenvwrapper是virtualenv的扩展包,用于更方便管理虚拟环境,它可以做: - 将所有虚拟环境整合在一个目录下 - 管理(新增,删除,复制)虚拟环境 - 快速切换虚拟环境

1. 安装

# on Windows pip install virtualenvwrapper-win # on macOS / Linux pip install --user virtualenvwrapper # then make Bash load virtualenvwrapper automatically echo "source virtualenvwrapper.sh" >> ~/.bashrc source ~/.bashrc

2. 创建虚拟环境

# on macOS/Linux: mkvirtualenv --python=python3.6 venv # on Windows mkvirtualenv --python=python3 venv

3. 激活环境

workon #列出虚拟环境列表 workon [venv] #切换环境

4. 退出环境

deactivate

5. 删除环境

rmvirtualenv venv

6. 其他有用指令

pip freeze #查看当前安装库版本 #创建 requirements.txt 文件,其中包含了当前环境中所有包及 各自的版本的简单列表 #保持部署相同,一键安装所有包 pip install -r requirements.txt pip freeze > requirements.txt lsvirtualenv #列举所有的环境 cdvirtualenv #导航到当前激活的虚拟环境的目录中,相当于pushd 目录 cdsitepackages # 和上面的类似,直接进入到 site-packages 目录 lssitepackages #显示 site-packages 目录中的内容

2.4、 使用pipenv管理

pipenv是Python官方推荐的包管理工具。 它综合了 virtualenv , pip 和 pyenv 三者的功能。能够自动为项目创建和管理虚拟环境。如果你使用过requests库,就一定会爱上这个库,因为是同一个大神出品。 pipenv使用 Pipfile 和 Pipfile.lock 来管理依赖包,并且在使用pipenv添加或删除包时,自动维护 Pipfile 文件,同时生成 Pipfile.lock 来锁定安装包的版本和依赖信息,避免构建错误。相比pip需要手动维护requirements.txt 中的安装包和版本,具有很大的进步。

1. 安装

pip install pipenv

2. 创建虚拟环境

$ cd myproject $ pipenv install # 创建环境 $ pipenv install requests # 或者直接安装库
如果不存在pipfile,会生成一个pipfile,并且如果有的库添加会自动编辑该文件,不会我们手动更新requirements.txt文件了。

3. 激活Pipenv Shell

$ pipenv shell $ python --version

三、vscode相关的虚拟环境问题

3.1、在 vscode 中如何选择虚拟环境

方法一:
  • command + shift + P
  • python:select interpreter
  • 选择特定虚拟环境
方法二:
直接点击页面最下边的这个位置,也会弹出选择框
notion imagenotion image

3.2、在 vscode 中显示双层虚拟环境

默认会出现双层虚拟环境,如下图
notion imagenotion image
原因: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 """ ./:表示扫描当前目录(默认只会扫描.py文件), --encoding:生成文件的编码方式 --force 强制执行,目录下已经存在requirements.txt时覆盖 --scan-notebooks:扫描 .ipynb 文件 """
遇到的问题:
  1. 扫描出来的问价内是空白:因为项目文件是 .ipynb 文件,需要在最后加参数:--scan-notebooks
    1. pipreqs ./ --encoding='utf-8' --force --scan-notebooks
     
    方法二:freeze
    通常情况下,我们一般使用以下命令导出 虚拟环境中的三方包:
    pip freeze > requirements.txt
    使用上述方法的话,有时导出的依赖会包含 @file 路径,如果继续使用 pip install -r requirements.txt命令来安装这些依赖的话会报错;
    所以在导出三方包的时候可以使用一下命令:
    pip list --format=freeze > requirements.txt
    注意:使用上述命令时,会将 distributepipsetuptools 和 wheel 也一并导出,建议手动删除上述四个依赖。

    4.1.2、安装

    在其他环境安装requirements.txt中的包时,可以使用pip方法
    pip install -r requirements.txt
    也可以使用conda方法:
    conda install --yes --file requirements.txt

    4.2、使用.yml文件方式转移

    将旧环境的包打包成.yml文件
    conda env export > freeze.yml
    用.yml文件创建新环境
    conda env create -n spider1 -f freeze.yml
    If you have any questions, please contact me.