跳转至

虚拟环境和包管理

  • pip + venv
  • pip + virtualenv + virtualenvwrapper
  • pipenv
  • conda

pip

文档:https://pip.pypa.io/en/stable/cli/

老版本的python中只有easy_install,easy_install 只能 install 不能 uninstall,也不能 freeze 出 requirements.txt

pip 是 easy_install(setuptools)的改进版,提供更好的提示信息,删除package等功能

20230205022458

pip 可以下载安装

如果觉得官方下载源比较慢,可以设置镜像

  • ~/.pip/pip.conf
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
trusted-host=mirrors.aliyun.com
  • ~/.pydistutils.cfg
[easy_install]
index-url = http://mirrors.tencentyun.com/pypi/simple    
pip  # 查看所有命令参数

pip list  # 查看已安装的包
pip list -o  # 查看过期的包

pip show xxx  # 查看某个库的具体信息(版本号、依赖、位置等)
pip show -f xxx  # 查询更加具体的信息
pip search xxx  # 搜索包,PyPI no longer supports pip search (or XML-RPC search). Please use https://pypi.org/search (via a browser) instead.

pip download xxx  # 下载包

pip install xxx  # 安装,默认安装最新版本
pip install xxx==version  # 指定版本
pip install [--user] xxx  # 安装到~/.local/bin
pip install --no-cache-dir xxx  # 不使用本地缓存安装
pip install xxx -i 镜像源 --trusted-host 镜像地址对应的host  # 指定镜像源

pip install --upgrade xxx  # 更新包,也可以更新pip自己

pip uninstall xxx  # 卸载包
  • freeze
# 查看已安装的包
pip freeze
# 将环境中所有已安装的库及其版本导出到指定文件
pip freeze > requirements.txt
# 安装指定文件中列出的所有库
pip install -r requirements.txt
# 卸载指定文件中列出的所有库
pip uninstall -r requirements.txt
  • 查看安装包大小
pip list | tail -n +3 | awk '{print $1}' | xargs pip show | grep -E 'Location:|Name:' | cut -d ' ' -f 2 | paste -d ' ' - - | awk '{print $2 "/" tolower($1)}' | xargs du -sh 2> /dev/null | sort -hr

pipdeptree

https://github.com/naiquevin/pipdeptree

pip install pipdeptree  # 单独安装

pipdeptree  # 可以按依赖关系以树形列出已安装的包
pipdeptree --reverse --packages xxa,xxb  # 列出依赖了xxa或xxb的包
pipdeptree --json-tree   # json嵌套格式返回
pipdeptree --graph-output png > dependencies.png  # 生成可视化的依赖图,需要安装graphviz,具体查看文档

pip-autoremove

pip install pip-autoremove

<<"COMMENT"
Usage: pip-autoremove [OPTION]... [NAME]...

Options:
  --version     show program's version number and exit
  -h, --help    show this help message and exit
  -l, --list    list unused dependencies, but don't uninstall them.
  -L, --leaves  list leaves (packages which are not used by any others).
  -y, --yes     don't ask for confirmation of uninstall deletions.
COMMENT

# 比如卸载Flask,可以将依赖包一并卸载
pip-autoremove Flask -y

venv

Python v3.6 开始,官方移除了·pyenv,推荐使用新的 venv 来创建虚拟环境

# 在当前目录创建一个名为env(可自定义)的虚拟环境,删除它即删除了虚拟环境
python3 -m venv venv [--without-pip]
"""
为了确保在安装 Python 或创建虚拟环境时不需要网络访问,ensurepip 模块将会把 pip 的完整副本及其依赖项安装到目标环境中
可以使用 --without-pip 选项不让 ensurepip 将 pip 引导到虚拟环境中

On Debian/Ubuntu systems, ensurepip is not available,
you need to install the python3-venv package using the following command.
  sudo apt-get update
  sudo apt install python3.x-venv
关于此事的一个讨论:https://bugs.launchpad.net/ubuntu/+source/python3.4/+bug/1290847
"""

# 激活虚拟环境,激活后命令提示符前会显示:(env)
source venv/bin/activate  # Mac/Linux
venv\Scripts\activate  # Windows

# 安装项目依赖
pip install -r requirements.txt

# 退出虚拟环境
deactivate

pipx

经常发现一些框架推荐使用 pipx insgall xxx 的方式来安装,究其原因是这些框架依赖过多,pipx可以将它们安装到自动创建的虚拟环境中。

私以为手动venv创建虚拟环境,然后用pip安装足矣。

pipenv

由requests库的作者Kenneth Reitz基于pip和virtualenv所编写

参考:https://www.liujiangblog.com/blog/18/

  • Windows:pip install pipenv
  • Mac:brew install pipenv

命令格式:pipenv [options] command [args]

初始化项目

如果是新项目,可以先用pipenv --python 3初始化(可指定具体版本)一个虚拟环境,查看当前环境所在路径:pipenv --venv,一般默认路径为:

  • Windows:~\.virtualenvs\
  • Mac:~/.local/share/virtualenvs/

删除虚拟环境:pipenv --rm

项目路径下会生成一个TOML格式的Pipfile文件,内容如下:

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]

[dev-packages]

[requires]
python_version = "3.7"

其中url字段为官方下载源,比较慢,建议替换为国内镜像源,比如:https://mirrors.aliyun.com/pypi/simple/

安装项目依赖

packagesdev-packages节点下列出了生产和开发环境所需的依赖,可以使用pipenv install [--dev]一键安装

tips:如果没有初始化项目(或者说没有Pipfile文件),直接执行`pipenv install [--two/three]会自动初始化并生成Pipfile。

pipenv install -r requirements.txt  # 从requirements.txt中安装
pipenv install xxx  # 安装
pipenv uninstall xxx  # 卸载

pipenv venv  # 查看当前环境路径
pipenv graph  # 查看依赖关系及信息
pipenv update  # 更新所有依赖

安装完依赖后会自动生成一个JSON格式的Pipfile.lock文件,保存着所有依赖的版本和hash信息(默认使用sha256算法给每一个包进行hash,可以保证在不安全的网络环境下也能下载到正确的包),每次更新或卸载依赖包都会更新此文件,即lock,类似于当前环境的一个快照,不要手动修改其内容。也可以手动lock:pipenv lock

  • 生成依赖列表(为了迁移回venv):pipenv lock -r

运行项目

pipenv run python xxx.py

如果python命令比较长,可以在Pipfile中添加[scripts]节点,然后创建一个别名,比如:

alias = "python3 manage.py runserver 0.0.0.0:8000"

然后执行pipenv run alias即可

当然还可以pipenv shell进入到虚拟环境中执行,退出:exit

virtualenv + virtualenvwrapper

pip install virtualenv

除非还使用Python2.x版本,否则使用自带的venv即可

virtualenv xxx  # 创建
rm -rf xxx  # 删除,或者手动删除对应文件夹

activate.bat  # 进入
deactivate.bat  # 退出

为了便于对虚拟环境集中管理,可搭配虚拟环境管理器virtualenvwrapper使用

pip install virtualenvwrapper-win

mkvirtualenv xxx  # 创建
rmvirtualenv xxx  # 删除
workon  # 查看

workon xxx  # 进入
deactivate.bat  # 退出

Conda

Python常被用于数据的处理,需要基于大量的第三方库,一个个手动安装这些库很麻烦,可以下载已经集成了这些库的发行版Python,比如Anaconda

Anaconda有:社区版(Anaconda Distribution)、企业版(Anaconda Enterprise)、最小发行版(Miniconda)

下载安装:https://www.anaconda.com/download/

Anaconda社区版包含

  • Anaconda Navigator 图形界面
  • Anaconda Cloud 包管理服务
  • Conda 包以及虚拟环境管理工具,还可以管理Python版本,可单独使用

虽然Conda来自Python社区且由Python语言开发,但它不止可以管理Python语言及Python的包,还可以管理其他语言的包(Java,R,Ruby,JS,Lua,Scala,C/C++,Fortran)

conda info
conda help

conda env list
conda info --envs  # 查看
conda create -n xxx python=3  # 创建
conda remove -n xxx --all  # 删除

activate xxx  # 进入
deactivate xxx  # 退出

conda install xxx
conda update xxx
conda remove xxx

评论