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

ilc*_*avo 34 python pip python-3.x

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

dan*_*ano 37

他们完全一样.事实上,分发Python模块的文档刚刚更新,建议使用python -m pip而不是pip可执行文件,因为它更容易分辨哪个版本的python将用于实际运行pip.

编辑:

这里有一些更具体的"证明",除了相信我的话和我链接的错误报告:)

如果您看一下pip可执行脚本,它只是这样做:

from pkg_resources import load_entry_point
<snip>
load_entry_point('pip==1.5.4', 'console_scripts', 'pip')()
Run Code Online (Sandbox Code Playgroud)

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

[console_scripts]
pip = pip:main
pip2.7 = pip:main
pip2 = pip:main
Run Code Online (Sandbox Code Playgroud)

因此返回的入口点是模块中的main函数pip.

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

import sys
from .runner import run

if __name__ == '__main__':
    exit = run()
    if exit:
        sys.exit(exit)
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它也只是调用pip.main函数.所以这两个命令最终都调用了相同的main函数pip/__init__.py.

  • 而这个“概念”不仅仅适用于`pip`,其他Python“命令行工具”也可以这样调用。例如,“python -m markdown”。引用 python 帮助菜单“-m mod:将库模块作为脚本运行” (3认同)
  • @ilciavo:小修正:`python -m pip`运行`pip/__ main __.py`模块,而不是`pip/__ init __.py`.这是一般规则:`python -m module`运行`module .__ main__`模块如果`module`是一个包(具有`__path__`属性),否则它运行`module`本身 - 两者都带有`__name __ ==" __main __"`. (3认同)
  • @ilciavo 看起来这是Python 2.6 的限制。它不支持使用带有“-m”标志的包。您必须直接使用“python -m pip.__main__”。 (2认同)

Kar*_*tel 10

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

从概念上讲,Pip 由两部分组成:pip标准库模块,包含在pip.py文件中;和一个pip“包装器”可执行文件。(在 Windows 上,这是作为实际的 .exe 文件实现的;在 Mac 和 Linux 上,它应该只是一个具有执行权限集且没有文件.py扩展名的 Python 脚本。)包装器的目的是运行“相应标准库模块中的main”代码。

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 安装

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

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


And*_*eas 8

2021年

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

pip install并且python -m pip install——实际上并不相同。或者欢迎回到版本和依赖的地狱:-(

pip(.exe) install <name>如果我想安装一个包,我习惯于输入。但是我遇到了麻烦,如果我尝试安装包 Pillow。它每次都会因错误消息而中断。

今天我重试python -m pip install从手册中复制和粘贴,它有效。在我忽略它并输入 pip .... 因为我认为它是相同的。

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

我用安装包打枕头。

#! .\venv\Scripts\python.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')()
    )
Run Code Online (Sandbox Code Playgroud)

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

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

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

在此处输入图片说明

我认为旧的 v19 pip 在检测支持的平台方面存在问题,因此安装了源代码而不是二进制文件。

  • 得票最高的答案支持了答案的具体例子。如果你建立一个更具体的案例,那么不同意海报会更引人注目——你的 Pillow 例子似乎与回答当前问题无关。使用“python -m pip”可以解决 Pillow 问题吗?感谢您的贡献! (2认同)
  • @AllenM 谢谢您的回答。我再次调查,发现如果我用它创建虚拟环境,pip-script.py 来自 PyCharm。如果我使用命令行 (python -m venv venv) 创建 venv,则该脚本在文件夹脚本中丢失。 (2认同)