需求分析
不同的工程 依赖 不同版本的库
例如:应用A需要 TensorFlow1.14,而应用B需要 TensorFlow2.x
不想让物理环境里充斥各种各样的库,引发未来的依赖灾难
解决思路
对于不同的工程使用不同的虚拟环境,保持开发环境以及宿主环境的清洁
每个应用可能需要各自拥有一套“独立”的Python运行环境
解决方案
基本常识
以anaconda为例,讲解各种目录
./Lib
存放自带python库
./Lib/site-packages
存放pip3 install 后的各种第三方库,
导出当前python环境的包
pip freeze > requirements.txt
virtualenv
在系统中建立多个不同并且相互不干扰的虚拟环境
用来为一个应用创建一套“隔离”的Python运行环境
轻量级第三方虚拟环境管理工具,不像Anaconda大小达上百M,virtualenv大小只有10M左右
安装&&配置
# 下载pip的包 v20.0.5
$ pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenv
# 升级pip工具
$ pip3 install --upgrade pip
基本参数
usage: virtualenv [--version] [--with-traceback] [-v | -q] [--discovery {builtin}] [-p py] [--creator {builtin,cpython3-win,venv}] [--seeder {app-data,pip}] [--no-seed] [--activators comma_separated_list] [--clear] [--system-site-packages]
[--symlinks | --copies] [--download | --no-download] [--extra-search-dir d [d ...]] [--pip version] [--setuptools version] [--wheel version] [--no-pip] [--no-setuptools] [--no-wheel] [--clear-app-data] [--symlink-app-data]
[--prompt prompt] [-h]
dest
-p # 创建python的拷贝
创建环境
首先创建目录
# 创建目录
$ mkdir myproject
$ cd myproject/
各类创建环境方法
# 创建独立的python环境,命名为venv
$ virtualenv venv
会在当前的目录中创建一个文件夹venv,包含:
python可执行文件,在 /Scripts
pip库的一份拷贝,在 /Lib/site-packages
这样就可以安装其他包,环境名字可以是任意的
# 指定python版本
# 只能使用本机存在的python版本创建虚拟环境
virtualenv -p
Python3.3以上的版本通过venv模块原生支持虚拟环境
# 当前目录创建
python -m evnv .
# 当前目录指定文件夹名
python -m evnv
注意:
不需要加–no-site-packages
* 最新的virtualenv不加–no-site-packages也不会读取系统包
* 高版本弃用该选项,会直接报错(如 20.0.5)
虚拟环境就是一个文件夹
* 如果要删除,直接删除文件夹(退出该虚拟环境)
激活/进入 环境
venv\Scripts\activate.bat
原理:修改相关环境变量,让命令python和pip均指向当前的virtualenv环境
退出环境
.\venv\Scripts\deactivate.bat
virtualenvwrapper
virtualenv缺点
每次开启虚拟环境之前要去虚拟环境所在目录下的 bin 目录下 source 一下 activate
需要记住每个虚拟环境所在的目录
为了更简便的切换和管理virtualenv环境,可以借助virtualenvwrapper扩展包,统一管理虚拟环境的目录,并且省去了source的步骤
安装
pip install virtualenvwrapper-win
WORKON_HOME默认的路径是 %USERPROFILE%\Envs
相关命令
# 创建虚拟环境
mkvirtualenv new_env
# 使用虚拟环境
workon new_env
# 退出虚拟环境
deactivate
# 删除虚拟环境
rmvirtualenv new_env
# 查看所有虚拟环境
lsvirtualenv
pipenv
Pipenv 是 Python 项目的依赖管理器。
如果您熟悉 Node.js 的 npm 或 Ruby 的 bundler,那么它们在思路上与这些工具类似。
尽管 pip 可以安装 Python 包, 但仍推荐使用 Pipenv,因为它是一种更高级的工具,可简化依赖关系管理的常见使用情况。
使用方法
创建项目目录,之后有 pipenv 安装包
pipenv install xxx
运行脚本
pipenv run python xx,py
生成新的shell
pipenv shell
conda
如果你需要的包要求不同版本的Python,你无需切换到不同的环境,因为conda同样是一个环境管理器。仅需要几条命令,你可以创建一个完全独立的环境来运行不同的Python版本,同时继续在你常规的环境中使用你常用的Python版本。 ——conda官方网站
vs pip
conda:比较方便地在不同环境之间进行切换,环境管理较为简单。
conda结合了pip和virtualenv的功能。
conda 本身是一个完整的程序,虽然是被用来管理 python 环境,但它本身不是 python 的一个包,也不依赖 python。
pip 或者 pipenv 本身是 python 的一个工具包,必须先安装 python 才能使用
环境管理
很多跟在--后边常用的命令选项,可以被略写为一个短线加命令首字母。所以--name选项和-n的作用是一样的。通过conda -h或conda –-help来看大量的缩写。
查看环境
# 查看当前环境列表, 处于激活状态的环境旁有 * 的字样,自身环境为 base
conda env list
conda info -e
conda info --envs
# 导出环境yaml, 类似于 pip freeze
conda env export > environment.yaml
创建环境
# 新建名为 newenv 的环境
# 创建跟当前系统python相同版本的 环境
conda create --name newenv
# 指定新环境中的 python 版本为 3.6
# 只带有最基本的包,是一个纯净的环境
conda create --name newenv python=3.6
# 带包
conda create -n myenv python=3.6 scipy=0.15.0 astroid babel
不想带默认包 --no-default-packages
conda create --no-default-packages -n myenv python
以 base 环境为基准,复制一个新环境
# 起名为 newenv。这样很多的包就可以不必重新安装了
conda create -n newenv --clone base
基于配置文件创建
conda env create -f .../environment.yaml
删除环境
# 删除一个已有的环境
conda remove --name newenv --all
环境切换
conda 4.6+
# 进入指定环境
conda activate newenv
# 在环境中,输入此命令退出
conda deactivate
解决powershell无法激活问题
Power Shell并不兼容anaconda的虚拟环境!
调出 PowerShell 管理员模式
# 安装PSCondaEnvs包
conda install -n root -c pscondaenvs pscondaenvs
# 更改PowerShell 的安全策略
Set-ExecutionPolicy RemoteSigned
# 激活环境,需要去掉原命令中开头的conda
activate 环境名
# 退出环境
deactivate
经过上述设置后,一启动powershell就自动激活base环境,如果不想,则
# 取消自动激活 base
conda config --set auto_activate_base false
# 自动激活 base
conda config --set auto_activate_base true
包管理
查看当前源仓库地址
conda config --show channels
指定国内源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes
conda list # 查看已经安装的包
conda update conda # 升级conda自身
conda search requests # 查询某个包
conda install requests # 安装新包
conda install -n test requests # 将包安装到指定环境
conda update --all # 更新所有包
conda update requests # 升级包
conda remove requests # 移除包
conda remove -n test requests # 从指定环境中移除包
conda 不提供检查可更新的包的命令,update 所有包时会有提示,列出所有可更新的包,并让用户确认是否全部更新。
conda install 安装包的远程仓库与 pip 的不一样
有一些包不一定能使用 conda 安装,比如 tushare
这时在环境中使用 pip install 即可
在 conda 中使用 pip 安装的包
不归属于 conda 管理,conda 也不会识别出来
必须进入环境后用 pip 命令才能看见