pip 安装使用详解

发布时间: 更新时间: 总字数:3259 阅读时间:7m 作者:IP:上海 网址

pip 类似 RedHat 里面的 yum,用来安装 Python 包非常方便。本节详细介绍 pip 的安装、以及使用方法。

介绍

Python pip 配置文件的存放位置和加载顺序,参考

  • 配置文件位置
  1. 全局(Global) /etc/pip.conf
  2. 用户(User) $HOME/.pip/pip.conf
  3. 虚拟环境(Site) $VIRTUAL_ENV/pip.conf
  • 加载顺序
PIP_CONFIG_FILE > Global > User > Site
  • 配置
# 当前配置,分别表示全局、用户、虚拟环境,下同
pip3 config --global list
pip3 config --user list
pip3 config --site list
  • 国内源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip config set install.trusted-host pypi.tuna.tsinghua.edu.cn

pip config set global.index-url http://mirrors.aliyun.com/pypi/simple
pip config set install.trusted-host mirrors.aliyun.com

pip config set global.timeout 10
pip config list

安装部署

Yum 安装

yum -y install python-pip

快速安装

$ wget https://bootstrap.pypa.io/get-pip.py
$ python get-pip.py

源码安装

下载源码:

wget "https://pypi.python.org/packages/source/p/pip/pip-1.5.4.tar.gz#md5=834b2904f92d46aaa333267fb1c922bb" --no-check-certificate

安装:

# tar -xzvf pip-1.5.4.tar.gz
# cd pip-1.5.4
# python setup.py install

pip 使用

# pip --help

Usage:
  pip <command> [options]

Commands:
  install                     安装包.
  uninstall                   卸载包.
  freeze                      按着一定格式输出已安装包列表
  list                        列出已安装包.
  show                        显示包详细信息.
  search                      搜索包,类似yum里的search.
  wheel                       Build wheels from your requirements.
  zip                         不推荐. Zip individual packages.
  unzip                       不推荐. Unzip individual packages.
  bundle                      不推荐. Create pybundles.
  help                        当前帮助.

General Options:
  -h, --help                  显示帮助.
  -v, --verbose               更多的输出,最多可以使用3次
  -V, --version               现实版本信息然后退出.
  -q, --quiet                 最少的输出.
  --log-file <path>           覆盖的方式记录verbose错误日志,默认文件:/root/.pip/pip.log
  --log <path>                不覆盖记录verbose输出的日志.
  --proxy <proxy>             Specify a proxy in the form [user:passwd@]proxy.server:port.
  --timeout <sec>             连接超时时间 (默认15秒).
  --exists-action <action>    Default action when a path already exists: (s)witch, (i)gnore, (w)ipe, (b)ackup.
  --cert <path>               证书.

pip 安装包

# pip install SomePackage
  [...]
  Successfully installed SomePackage
  • pip install -e . -e 为 editable,即修改本地文件,调用的模块以最新文件为准
    • https://setuptools.pypa.io/en/latest/userguide/development_mode.html
    • pip 不会复制代码,而是在 Python 的安装目录(site-packages)中创建一个软链接(或 .pth 文件),指向你当前的源代码目录
    • 优点:修改了当前目录下的源代码,不需要重新安装,再次运行程序时,修改会立即生效
  • --trusted-host environment variable: PIP_TRUSTED_HOST,参考

pip 查看已安装的包

# 查看某个已安装的包具体提供了哪些文件(以及这些文件安装在哪)
pip show -f <包名>

# 或者
pip show --files <包名>

$ pip show SomePackage
# pip show --files SomePackage
  Name: SomePackage
  Version: 1.0
  Location: /my/env/lib/pythonx.x/site-packages
  Files:
   ../somepackage/__init__.py
   [...]

pip 检查哪些包需要更新

# pip list --outdated
  SomePackage (Current: 1.0 Latest: 2.0)

pip 升级包

# pip install --upgrade SomePackage
  [...]
  Found existing installation: SomePackage 1.0
  Uninstalling SomePackage:
    Successfully uninstalled SomePackage
  Running setup.py install for SomePackage
  Successfully installed SomePackage

pip 指定目录安装

pip install --target ./package SomePackage

pip 指定 git 安装

pip install git+http://127.0.0.1/xxx.git --user

pip 卸载包

$ pip uninstall SomePackage
  Uninstalling SomePackage:
    /my/env/lib/pythonx.x/site-packages/somepackage
  Proceed (y/n)? y
  Successfully uninstalled SomePackage

下载包

旧版 pip 下载方式:

pip install --download /pip -r requirements.txt

pip 9, 10 版本的下载方式:

pip download -d /pip -r requirements.txt

pip 使用示例

  • 安装 python redis
# pip install redis
  • 卸载 python redis
# pip uninstall redis
Uninstalling redis:
  /usr/lib/python2.6/site-packages/redis-2.9.1-py2.6.egg-info
.....省略一些内容....
Proceed (y/n)? y
  Successfully uninstalled redis

清理缓存

pip cache purge

# 或
pip --no-cache-dir

pip wheel

读取当前目录下的 Python 项目配置,为其以及它的所有依赖项构建 Wheel 格式(.whl)的安装包,并输出到指定的目录中

pip wheel . -w <输出目录>
# 将当前项目及其依赖打包成 wheel 文件,并存放到当前目录的 wheelhouse 文件夹中,去 pypi 下载个包,然后执行下面的命令,做出离线安装包
pip wheel . -w wheelhouse/

Python wheel (.whl) 文件修改:

  • .whl 本质上是一个标准的 ZIP 压缩包
  • .dist-info/RECORD 文件记录包内所有文件的路径、哈希值(Hash)和大小,如果修改文件需要做对应的调整

pip auditwheel

pip auditwheel 的作用:扫描你的 Wheel 包,把所有依赖的外部动态链接库直接“塞进”包里面,并打上标准的 manylinux 标签,让这个包可以在几乎所有主流 Linux 发行版上直接运行(Portable)

# 扫描这个 Wheel 文件,分析里面的二进制文件(.so)依赖了哪些外部的系统库
python -m auditwheel show xx

# 用来“打包带走”的,把所有缺少的依赖打包进文件里,生成一个高度兼容、发到 PyPI 上所有人都能无脑 pip install 的超级安装包
# 第一个 xx:需要修复的源 Wheel 文件路径(例如 my_package-1.0-linux_x86_64.whl)
# -w xx (或 --wheel-dir):指定输出目录。修复完成后,新生成的 Wheel 文件会保存在这个目录里
# --plat xx:指定你要兼容的目标平台标签(Platform Tag)。常见的标签如 manylinux2014_x86_64 或 manylinux_2_28_x86_64。如果不指定,它会自动推断一个
python -m auditwheel repair xx -w xx --plat xx

其他说明

pip install

pip help install ...

constraint.txt 格式

MySQL-python===1.2.5;python_version=='2.7'
MarkupSafe===1.0
pypowervm===1.1.6
doc8===0.8.0
pymongo===3.5.1
sqlparse===0.2.3

使用:

pip install -c constraint.txt

requirement.txt 格式

版本依赖文件

Parsley # MIT
six>=1.9.0 # MIT
packaging>=16.5 # Apache-2.0
requests>=2.14.2 # Apache-2.0
PyYAML>=3.10 # MIT
backports.zoneinfo==0.2.1;python_version<"3.9"   # 指定python版本,否则不安装

使用:

pip install -r requirement.txt

pip –no-cache-dir

  • pip --no-cache-dir 不缓存 pip,默认的缓存目录 ~/.cache/pip,修改默认的缓存目录(任选一个):
    • export PIP_CACHE_DIR="<some-dir>"
    • pip config set global.no-cache-dir false
    • pip.conf 配置:
[global]
no-cache-dir = false
  • 缓存管理命令:
    • 删除所有缓存 pip cache purge
    • 查看缓存:pip cache list
# 查看缓存的基本信息(包含缓存位置、大小等)
pip cache info

# 列出缓存中的包
pip cache list
pip cache list numpy

# 如果打包失败,可以使用 --no-clean 参数,这样 pip 就不会删除临时目录
pip install ./my-source-package --no-clean

pip cache

  • 默认路径:
    • Linux ~/.cache/pip
    • Mac ~/Library/Caches/pip
# 查看缓存目录
pip cache dir

# 查看缓存的基本信息(包含缓存位置、大小等)
pip cache info

# 列出缓存中的包,也可以指定包名来查找特定包的缓存,例如:pip cache list numpy
pip cache list

# 清理全部缓存(释放磁盘空间)
pip cache purge

# 删除特定包的缓存
pip cache remove <包名>

# 安装时禁用缓存
pip install --no-cache-dir <包名>

# 改默认的缓存目录
export PIP_CACHE_DIR=/path/to/your/custom/cache

或 pip.conf
[global]
cache-dir = /path/to/your/custom/cache

pip index versions

# 获取pypi支持的版本信息
pip index versions requests

# 获取最新的一个 Available versions
pip index versions requests 2>/dev/null | awk '/Available versions:/ {gsub(/,/, "", $3); print $3}'
pip index versions requests 2>/dev/null | sed -n 's/.*Available versions:[[:space:]]*\([^,]*\).*/\1/p'
pip index versions requests 2>/dev/null | grep -oP '(?<=Available versions: )[^,]+'

error: externally-managed-environment

部分系统使用 pip install 时出错:

$ sudo pip3 install xxx
error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try 'pacman -S
    python-xyz', where xyz is the package you are trying to
    install.

    If you wish to install a non-Arch-packaged Python package,
    create a virtual environment using 'python -m venv path/to/venv'.
    Then use path/to/venv/bin/python and path/to/venv/bin/pip.

    If you wish to install a non-Arch packaged Python application,
    it may be easiest to use 'pipx install xyz', which will manage a
    virtual environment for you. Make sure you have python-pipx
    installed via pacman.

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.
  • 原因
    • Manjaro 22、Ubuntu 23.04、Fedora 38 以及其他的最新发行版中,正在使用 Python 包来实现此增强功能
      • 用来避免操作系统包管理器 (如 pacman、yum、apt) 和 pip 等特定于 Python 的包管理工具之间的冲突
  • 解决方式
# 方法一
sudo mv /usr/lib/python3.x/EXTERNALLY-MANAGED{,.bak}

# 方法二:使用 venv 隔离环境
# 使用 pipx 安装 cli
pipx install <package-name>

# 方法三:使用 apt 等包管理工具安装 python3-xxx

方法四:强制允许 pip 在系统全局 Python 环境中安装包,即使这可能会破坏操作系统自带的依赖关系

PIP_BREAK_SYSTEM_PACKAGES=1
pip install SomePackage --break-system-packages  # pip 23.0 及更高版本中引入