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

时间:2014-09-09 16:24:45

标签: python python-3.x pip

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

2 个答案:

答案 0 :(得分:29)

他们完全一样。事实上,分发Python模块的文档是just updated建议使用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')()

它正在调用load_entry_point,它返回一个函数,然后执行该函数。它使用的入口点称为'console_scripts'。如果你查看pip的entry_points.txt文件(我的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函数。

答案 1 :(得分:6)

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调用了脚本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')()
    )

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

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

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

enter image description here

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