“pip install”和“python -m pip install”有什么区别?

2025-01-15 08:45:00
admin
原创
137
摘要:问题描述:我有一个本地版本的 Python 3.4.1,我可以运行python -m pip install,但我找不到 pip 二进制文件来运行pip install。这两者有什么区别?解决方案 1:它们的作用完全相同,假设pip使用与可执行文件相同的 Python 版本python。分发 Python 模...

问题描述:

我有一个本地版本的 Python 3.4.1,我可以运行python -m pip install,但我找不到 pip 二进制文件来运行pip install。这两者有什么区别?


解决方案 1:

它们的作用完全相同,假设pip使用与可执行文件相同的 Python 版本python。分发 Python 模块的文档刚刚更新,建议使用python -m pip而不是pip可执行文件,因为它允许您明确说明要使用哪个版本的 Python。在安装了多个 Python 版本的系统中,并不总是清楚pip链接到哪个版本。


这里有一些更具体的“证据”,证明这两个命令应该做同样的事情,而不仅仅是相信我的话和我链接的错误报告:)

如果你看一下pip可执行脚本,它只是在执行以下操作:

from pkg_resources import load_entry_point
<snip>
load_entry_point('pip==1.5.4', 'console_scripts', 'pip')()

它调用load_entry_point,返回一个函数,然后执行该函数。它使用的入口点称为'console_scripts'。如果你查看 entry_points.txt 文件pip(我的 Ubuntu 机器上的 /usr/lib/python2.7/dist-packages/pip-1.5.4.egg-info/entry_points.txt),你会看到以下内容:

[console_scripts]
pip = pip:main
pip2.7 = pip:main
pip2 = pip:main

所以返回的入口点是模块main中的函数pip

当你运行 时python -m pip,你正在执行包__main__.py内的脚本pip。它看起来像这样:

import sys
from .runner import run

if __name__ == '__main__':
    exit = run()
    if exit:
        sys.exit(exit)

runner.run函数如下所示:

def run():
    base = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    ## FIXME: this is kind of crude; if we could create a fake pip
    ## module, then exec into it and update pip.__path__ properly, we
    ## wouldn't have to update sys.path:
    sys.path.insert(0, base)
    import pip
    return pip.main()

如您所见,它也只是调用了该pip.main函数。因此,两个命令最终都会调用main中的同一个函数pip/__init__.py

解决方案 2:

2021

仅当您使用 PyCharm 创建 venv 时才会发生这种情况。请检查 Scripts/pip-script.py 是否位于您的虚拟环境中

pip installpython -m pip install-- 其实并不一样。或者欢迎回到版本控制和依赖关系的地狱:-(

我习惯于输入“安装”pip(.exe) install <name>来安装某个软件包。但是,如果我尝试安装 Pillow 软件包,就会遇到麻烦。每次安装都会出现错误消息。

今天我重试python -m pip install从手册中复制粘贴,它起作用了。之前我忽略了它并输入 pip.... 因为我认为它们是一样的。

我开始深入研究 pip,并找到了这个问题/答案。过了一会儿,我发现 pip.exe 调用脚本 <virtual-environment/Scripts>pip-script.py。

我正在努力安装 Pillow 软件包。

#! .envScriptspython.exe
# EASY-INSTALL-ENTRY-SCRIPT: 'pip==19.0.3','console_scripts','pip3'
__requires__ = 'pip==19.0.3'
import re
import sys
from pkg_resources import load_entry_point

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script.pyw?|.exe)?$', '', sys.argv[0])
    sys.exit(
        load_entry_point('pip==19.0.3', 'console_scripts', 'pip3')()
    )

我有点惊讶 pip.exe 仍然使用旧版本的 19.0.3 包而不是新安装的版本 21.0.1。

我手动将两个版本字符串更改为 21.0.1。现在 pip.exe 能够正确安装 Pillow。

从现在起我明白了为什么 pip 仍然抱怨我使用旧版本的 pip。

在此处输入图片描述

我认为旧的 v19 pip 无法检测支持的平台,因此安装的是源而不是二进制文件。

解决方案 3:

每个 Python 安装都可能附带其自己的 Pip 版本。(某些安装可能出于安全原因故意排除 Pip:例如,当 Python 包含在 Linux 发行版中时,它通常会省略 Pip,以便用户不会无意中将有害内容安装到操作系统所依赖的 Python 副本中。)

从概念上讲,Pip 由两部分组成:实际的库代码,与其他第三方软件包一起安装(使用特殊的引导过程);以及pip“包装器”可执行文件。(在 Windows 上,它被实现为一个实际的 .exe 文件;在 Mac 和 Linux 上,它应该只是一个设置了执行权限且没有.py文件扩展名的 Python 脚本。)包装器的目的是运行相应标准库模块中的“主”代码。

pip在命令行上使用将查找并运行PATH 环境变量中第一个包装器可执行文件,然后它将运行与该包装器关联的 Python 安装的相应 Python 代码。因此,它将为任何 Python 安装第三方库。

python -m pip在命令行中使用将查找并运行PATH 环境变量中第一个Python ,并指示它在其pip标准库中查找标准库模块(不是直接查找;它将像任何模块导入一样进行搜索)并将其“作为模块”运行。因此,它将为在 PATH 中找到的 Python 安装第三方库。sys.path

在 Windows 上,py -m pip在命令行上使用 将(除非系统配置严重错误)找到并运行可执行文件py该文件安装到始终位于 PATH 上的 Windows 目录中。反过来,它将使用自己的逻辑在系统上选择 Python,运行 pip,然后从那里继续执行之前的操作。

根据系统的配置方式,这些命令可能不会都选择相同的 Python 安装

使用确保为将要运行的相同 Pythonpython -m pip安装库,使用。这对于那些编写、需要该代码使用将要安装的库并希望它与任何库一起运行的人来说非常有用。python myscript.pymyscript.py`python`

作为 Windows 的特别说明,pip install --upgrade pip将不起作用。这是因为升级 Pip 涉及替换磁盘上的 Pip 包装器可执行文件;通过以这种方式运行命令,包装器可执行文件是正在运行的程序,而 Windows 不允许程序在磁盘上替换自身。通过使用python -m pip install --upgrade pippy -m pip install --upgrade pip,可以避免该问题,因为现在包装器可执行文件不运行 - Python(可能还有)使用来自(或缓存的)文件的py代码运行。pip.py`pip.pyc`

解决方案 4:

python -m pip:将 pip 模块作为 Python 脚本运行

pip:运行 pip 可执行文件

通常,它们会一起安装并指向同一个 Python 脚本。因此,在大多数情况下,您可以使用任一形式的命令,它们都会获得相同的结果。但是,使用python -m pip可确保为将运行的相同 Python 实例安装库,例如 python <script.py>。如果在虚拟环境中,这将是“activate”命令设置的 Python 版本。某些虚拟环境可能会或可能不会为 pip 设置新路径。因此,python -m pip通常最好使用明确的命令。

如果您想测试以确保它们在您的路径上正确找到:

视窗:

where python
where pip

Linux:

which python
which pip

注意:venv 也将为激活环境设置 pip 的路径。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3975  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2742  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   80  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   88  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   77  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用