欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

PythonPip 软件包的安装和原理(Windows 系统) - pip 的使用

最编程 2024-09-30 10:40:05
...

        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,它会自动调整环境变量。

推荐阅读