【深度学习基础】一篇弄懂PyPI和pip(呕心沥血版)
【深度学习基础】一篇弄懂PyPI和pip(呕心沥血版)
1. 前言
对于刚刚使用Python 的同学肯定会使用到pip去下载各种包和库来方便自己使用,但是大家有没有想过一个问题:
- pip为什么可以下载各种包来直接给你使用?
- pip是从哪里获得这些包(本质是包装好的代码)?
答案是:PyPI仓库。pip是从PyPi这个大型软件存储仓库中获取到你所指定的包,同时下载到你所指定的位置的一个工具。
简单来说:PyPI(Python Package Index)是一个包管理平台。它是 Python 官方的软件包仓库,开发者可以在 PyPI 上发布、维护和分发 Python 库,用户也可以通过pip install 轻松安装这些库。本文将详细介绍 PyPI&PIP的使用方法、如何发布自己的Python 包,以及一些常见问题的解答。
2. PyPI&PIP是什么
PyPI(Python Package Index) 是Python 官方的软件包存储库,类似于 Maven Central(Java)和 npm Registry(Node.js) 等其他编程语言的包管理平台。PyPI 的作用包括:
- 存储&分发 Python 库:开发者将自己的 Python 项目上传到 PyPI,供全球用户下载和使用。
- 下载Python 库:用户可以使用 pip install 从PyPI中下载自己需要的软件包。
- 软件版本管理:支持管理多个版本的软件包,方便开发者维护和更新。
pip 是 Python 的包管理器。这意味着它是一个工具,允许你从PyPI中安装和管理不属于标准库的其他库和依赖。如果你已经了解了其他语言,那么可能会对包管理器的概念比较熟悉。JavaScript 使用 npm 管理软件包,Ruby 使用 gem,以及 .NET 使用 NuGet。Python 中,则是 pip 作为标准包管理器。
pip工具使得我们可以使用PyPI软件包仓库
3. 如何使用PyPI仓库
使用PyPI仓库包括:
- 从仓库中下载软件包。
- 从仓库中搜索软件包。
- 从仓库中查看软件包。
3.1 利用pip工具下载软件包
3.1.1 默认安装
作用:从 Python 包索引(PyPI)下载并安装包的最新版本。
语法:
pip install <包名>
示例:
pip install requests
3.1.2 指定版本安装
作用:指定包的版本号,安装特定版本。
语法:
pip install <包名>==<版本号>
pip install <包名>>=<最低版本号>
pip install <包名><=最高版本号>
示例:
pip install pandas==1.5.3 # 安装 pandas 1.5.3
pip install flask>=2.0.0 # 安装 2.0.0 或更高版本的 flask
3.1.3 从requirements.txt 中批量安装
作用:根据 requirements.txt 文件批量安装所有依赖包。
语法:
pip install -r <文件路径>
示例:
pip install -r requirements.txt # 安装当前目录下的 requirements.txt 中的依赖
3.1.4 从本地文件安装
作用:安装本地已下载的包文件(如 .whl 或 .tar.gz)。
语法:
pip install <本地文件路径>
示例:
pip install ./numpy-1.23.5-cp39-cp39-win_amd64.whl # 安装本地 .whl 文件
pip install /path/to/mypackage.tar.gz # 安装本地源码包
.whl 或 .tar.gz的区别:
特性 | .whl | .tar.gz |
---|---|---|
格式 | 二进制分发格式 | 源码分发格式 |
安装速度 | 快速(无需编译) | 较慢(可能需要编译) |
跨平台 | 针对特定平台和 Python 版本 | 适用于所有平台和 Python 版本 |
内容 | 预编译的 Python 代码和元数据 | 源代码和配置文件 |
推荐使用 | 官方推荐,优先使用 | 在没有 .whl 文件时使用 |
3.1.5 从 Git 仓库安装
作用:直接从 Git 仓库(如 GitHub、GitLab)克隆代码并安装。
语法:
pip install git+<仓库URL>@<分支/标签/提交号>
示例:
pip install git+https://github.com/user/repo.git # 安装主分支
pip install git+https://github.com/user/repo.git@v1.0 # 安装指定标签
pip install git+https://github.com/user/repo.git@commit_hash # 安装指定提交
3.1.6 安装到指定目录
作用:将包安装到自定义目录(非默认的 Python 环境)。
语法:
pip install --target=<目录路径> <包名>
示例:
pip install --target=./mylibs requests # 安装到当前目录的 mylibs 文件夹
写到这里突然想起来一个知识点(安装是否检查依赖冲突问题):
- pip安装仅仅检查直接依赖是否冲突,不检查间接依赖是否冲突。
- conda安装检查直接和间接依赖是否冲突。
3.2 利用pip工具搜索软件包
搜索软件包就是找PyPI软件仓库中有没有你想要的库。可以直接在 PyPI 官网 搜索软件包,例如搜索
flask
可以找到 Flask Web 框架。或者使用
pip search
命令(此命令已在新版 pip 中被移除)
3.2.1 通过 PyPI 官网搜索(推荐)
访问 PyPI 官网 直接在搜索栏中输入关键词,可以找到所有相关的 Python 包。优点:最权威、最全面的搜索方式,支持按名称、描述、关键字等过滤。
3.2.2 使用命令行工具(第三方工具 pip-search)
安装 pip-search 工具:
pip install pip-search
搜索包:
pip-search requests
输出示例:
Name Version Description
---------------- ------- --------------------------
requests 2.31.0 Python HTTP for Humans.
requests-oauthlib 1.3.1 OAuthlib support for requests.
...
3.3 利用pip工具查看软件包
在安装某个包前,可以使用
pip show
查看详细信息:
pip show requests
输出示例:
Name: requests
Version: 2.28.0
Summary: Python HTTP for Humans.
Home-page: https://requests.readthedocs.io/
Author: Kenneth Reitz
License: Apache 2.0
4. 如何上传自己的包到PyPI
如果你开发了一个 Python 库,并希望发布到 PyPI 供他人使用,可以按照以下步骤操作。
4.1 注册 PyPI 账户
- 访问 PyPI 官网 并注册一个账户。
- 进入 API 令牌管理 页面,创建一个新的 API 令牌(用于安全上传)。
4.2 编写
setup.py
在 Python 项目的根目录下创建
setup.py
,示例如下:
from setuptools import setup, find_packages
# 读取 README 文件内容作为项目长描述(可选)
with open("README.md", "r", encoding="utf-8") as fh:
long_description = fh.read()
setup(
# 基础元数据
name="my_project", # 项目名称(PyPI 上唯一的标识符)
version="0.1.0", # 版本号(遵循语义化版本规范)
author="Your Name",
author_email="your.email@example.com",
description="A short description of your project", # 简短描述
long_description=open("README.md", encoding="utf-8").read(),
long_description_content_type="text/markdown", # 长描述格式
url="https://github.com/yourusername/my_project", # 项目主页
# 包配置
packages=find_packages(where="src"), # 自动发现包(推荐将代码放在 src 目录)
package_dir={"": "src"}, # 指定包根目录为 src
# 依赖管理
install_requires=[
"requests>=2.25.1", # 项目运行所需的核心依赖
"numpy>=1.21.0",
],
extras_require={
"dev": ["pytest>=6.0", "black>=21.0"], # 开发环境依赖(pip install .[dev])
"docs": ["sphinx>=4.0"], # 文档生成依赖
},
# 包含非代码文件(如数据、配置文件)
include_package_data=True, # 需配合 MANIFEST.in 文件使用
# package_data={"my_package": ["data/*.json"]}, # 指定包内数据文件
# 命令行工具配置
entry_points={
"console_scripts": [
"mycli=my_package.cli:main", # 创建命令行命令 mycli
],
},
# 分类信息(用于 PyPI 分类)
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
# Python 版本要求
python_requires=">=3.8",
)
4.3 构建Python 包
安装
setuptools
和
wheel
(如果尚未安装):
pip install setuptools wheel
使用
setup.py
生成分发包:
python setup.py sdist # 生成源码包
python setup.py bdist_wheel # 生成二进制包
或者使用现代打包工具
build
(推荐):
pip install build
python -m build
成功后,会在
dist/
目录下生成
.tar.gz
和
.whl
文件,例如:
my_project/
├── src/
│ └── my_package/
│ ├── __init__.py
│ └── core.py
├── tests/
├── pyproject.toml # 核心配置文件
├── README.md
└── LICENSE
4.4 使用 TestPyPI 进行测试
在正式发布之前,可以先将包上传到 TestPyPI(PyPI 的测试环境),以避免错误的发布影响正式版本。
- 上传到 TestPyPI:
twine upload --repository testpypi my_project/*
- 然后从 TestPyPI 安装:
pip install --index-url https://test.pypi.org/simple/ mypackage
TestPyPI 的索引地址: https://test.pypi.org/simple/
mypackage:要安装的包名
- 如果测试通过,再上传到正式的 PyPI。
4.5 上传到 PyPI
安装
twine
:
pip install twine
使用
twine
上传:
twine upload my_project/*
然后,其他用户就可以通过
pip install mypackage
安装你的包了! 🎉
5. set.up.py 和 requirement.txt 的区别
我们知道我们每次下载一个项目后都需要下载项目所需要的依赖。这个依赖的下载一般都会写在 set.up.py 和 requirement.txt 中。因此我们会运行两个指令来一键安装依赖。
首先运行:
pip install -r requirements.txt
然后运行:
python setup.py install
那么两者有什么区别呢?见下图:
6. 总结
- PyPI 是 Python 官方的软件包存储库:提供数十万个 Python 包,支持开发者发布和分发软件。
- **使用
pip
进行包管理工具**:包括安装、升级和卸载 Python 库。
- python -m build:生成Python包。
- **开发者可以使用
twine
上传自己的 Python 包**:并通过
setup.py
或
pyproject.toml
进行打包。
- 可以使用 TestPyPI 进行测试:避免影响正式版本。
- 提高安全意识:防范恶意软件,使用 API 令牌进行安全认证。
打包的流程:
- 写项目代码。
- 在项目根目录执行:python -m build 建立Python包
- 使用 TestPyPI 进行测试。
- 使用**
twine
上传自己的 Python 包**
PyPI 是 Python 生态系统的核心之一,掌握 PyPI 的使用方法,可以更高效地管理 Python 依赖,并发布自己的 Python 库! 🚀