Python:Pip包的安装与原理(Windows系统)
相关内容
Pythonhttps://blog.csdn.net/weixin_45791458/category_12403403.html?spm=1001.2014.3001.5482
pip是Python的包管理工具,用于安装、升级和卸载Python包和依赖。它的全称是“Pip Installs Packages”,是Python生态系统中的标准包管理器。pip从Python Package Index (PyPI)中下载和安装Python软件包,使得开发者可以轻松地管理项目的依赖项。
pip的安装
1、自Python 3.4和Python 2.7.9开始,Python的安装包中默认包含了pip,如图1所示。因此,从Python 3.4及更高版本,pip会自动随Python安装,除非在安装过程中选择不安装pip,如图2所示。
图1 默认安装pip
图2 可选的不安装pip
2、使用下面的命令获得安装脚本,并用Python解释器执行,但这要求Python解释器的版本最小为3.8(需要连接互联网)。
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py
实际上,get-pip.py中有一个用Base85编码嵌入的pip包,执行该脚本会在系统中创建一个临时目录,随后将Base85编码的pip包解码成一个zip文件并在其中解压,接着临时目录被加入Python解释器的搜索路径sys.path后,最后运行嵌入的pip来从互联网安装最新版本的pip。
3、自Python 3.4和Python 2.7.9开始,ensurepip模块加入了Python标准库,执行下面的命令以安装pip,这无需连接互联网,因为pip包的.whl文件已被包含在库中。
python -m ensurepip
4、使用conda安装Python,它会强制安装包括pip在内的一些包,如图3所示。
图3 conda会强制安装pip包
在pip包安装完成后,可以在Python的包文件夹中找到(...\Lib\site-packages中),如图4所示,
图4 pip已安装
在pip安装后,还会发现在Scripts文件夹下多出了pip.exe、pip3.exe之类的可执行文件,如图5所示,它们其实入口点(entry point)程序,这将在之后说明。
图5 pip的入口点程序
pip的使用
pip有两种使用方法,一种是通过之前介绍的可执行文件pip.exe,另一种是通过python -m命令。
可执行文件pip.exe
在Python环境中,入口点程序是一种机制,用于定义一个可以从命令行直接调用函数的方式。以下是关于入口点的详细解释:
1. 入口点的概念
入口点是指应用程序、模块或脚本在运行时的起点,也就是“入口”。在Python的上下文中,入口点允许你以一种便捷的方式在命令行中调用Python脚本而不需要显式地使用Python解释器来执行。
2. 入口点在Python中的应用
在Python中,入口点程序通常通过工具(如setuptools)来定义。其工作方式通常是为一个函数创建一个可以在命令行中执行的“快捷方式”。
3. 如何查看入口点
以pip.exe文件为例,它实际上就是一个通过入口点生成的可执行文件。当运行pip.exe文件时,它引导Python去找到pip包,然后调用这个包的主函数,可以通过图4中的pip-24.0.dist-info文件夹下的entry_points.txt查看入口点信息,如下所示。
# 文件entry_points.txt
[console_scripts]
pip = pip._internal.cli.main:main
pip3 = pip._internal.cli.main:main
目前的pip包使用配置文件pyproject.toml(可在github中pip包的根目录找到),其中与生成pip.exe有关的部分如下所示。
# 文件pyproject.toml
*****
[project.scripts]
pip = "pip._internal.cli.main:main"
pip3 = "pip._internal.cli.main:main"
*****
这意味着其实执行pip.exe就相当于执行了pip._internal.cli.main.py文件下的main函数。
如果使用旧的配置文件setup.cfg,应该如下所示。
# 文件setup.cfg
*****
[options.entry_points]
console_scripts =pip = pip._internal.cli.main:mainpip3 = pip._internal.cli.main:main
*****
如果使用更早的配置文件setup.py,应该如下所示。
# 文件setup.py
*****
entry_points={"console_scripts": ["pip = pip._internal.cli.main:main","pip3 = pip._internal.cli.main:main",],}
*****
pip.exe会记录构建其的Python解释器的路径,所以不能移动Python文件夹的位置(pip.exe可以移动,但不要这么做),同时需要保证pip包在Python的搜索路径sys.path中(这一般能保证,因为其一般位于...\Lib\site-packages中)。
使用下面的命令可以查看pip.exe绑定到的Python解释器。
pip --version
pip 24.0 from C:\Users\12078\AppData\Local\Programs\Python\Python311\Lib\site-packages\pip (python 3.11)
下面用pip.exe安装了tqdm包,可以发现它也在Scripts文件夹下创建了tqdm.exe文件,如图6所示。
pip install tqdm
图6 tqdm的入口点程序
python -m命令
python -m用于将一个模块或包当作脚本运行(顺带一提,如果使用python -m命令,则sys.path[0]就变成当前工作目录,就像交互式Python中那样)。
如果用python -m去运行一个包,则会运行其中的__main__.py文件,pip包的__main__.py如下所示。
# 文件__main__.py
import os
import sys
# Remove '' and current working directory from the first entry
# of sys.path, if present to avoid using current directory
# in pip commands check, freeze, install, list and show,
# when invoked as python -m pip <command>
if sys.path[0] in ("", os.getcwd()):sys.path.pop(0)# If we are running from a wheel, add the wheel to sys.path
# This allows the usage python pip-*.whl/pip install pip-*.whl
if __package__ == "":# __file__ is pip-*.whl/pip/__main__.py# first dirname call strips of '/__main__.py', second strips off '/pip'# Resulting path is the name of the wheel itself# Add that to sys.path so we can import pippath = os.path.dirname(os.path.dirname(__file__))sys.path.insert(0, path)if __name__ == "__main__":from pip._internal.cli.main import main as _mainsys.exit(_main())
可以看出,这其实还是相当于和可执行文件pip.exe一样,执行了同一个main函数。但使用它的好处在于更加便捷。
虚拟环境
不论是通过可执行文件pip.exe还是通过python -m命令,都需要确保绑定到目标Python的pip.exe或目标Python在PATH路径下。如果一个系统中存在多个版本的Python,则无可避免地需要使用绝对/相对路径名。
使用虚拟环境可以解决这个问题,例如Anaconda,它会自动调整环境变量。