Python:Pip包的安装与原理(Windows系统)

相关内容

Pythonicon-default.png?t=O83Ahttps://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:main
    pip3 = 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 pip
    path = os.path.dirname(os.path.dirname(__file__))
    sys.path.insert(0, path)

if __name__ == "__main__":
    from pip._internal.cli.main import main as _main
    sys.exit(_main())

        可以看出,这其实还是相当于和可执行文件pip.exe一样,执行了同一个main函数。但使用它的好处在于更加便捷。

虚拟环境

        不论是通过可执行文件pip.exe还是通过python -m命令,都需要确保绑定到目标Python的pip.exe或目标Python在PATH路径下。如果一个系统中存在多个版本的Python,则无可避免地需要使用绝对/相对路径名。

        使用虚拟环境可以解决这个问题,例如Anaconda,它会自动调整环境变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日晨难再

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值