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

66bbxpm5  于 2023-05-08  发布在  Python
关注(0)|答案(3)|浏览(293)

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

hsvhsicv

hsvhsicv1#

他们做的事情完全一样。实际上,发布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

因此返回的入口点是pip模块中的main函数。
当您运行python -m pip时,您正在执行pip包中的__main__.py脚本。它看起来像这样:

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函数。因此,这两个命令最终都调用了pip/__init__.py中的同一个main函数。

brccelvz

brccelvz2#

2021年**

只有在使用PyCharm创建venv时才会发生这种情况。请检查Scripts/ www.example.com是否pip-script.py位于虚拟环境中

pip installpython -m pip install并不完全相同。或者欢迎回到版本化和依赖性的地狱:-(
如果我想安装一个软件包,我习惯输入pip(.exe) install <name>。但我遇到麻烦,如果我试图安装软件包枕头。它每次都会中断并显示错误消息。
今天我重试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')()
    )

我有点惊讶,pip.exe仍然使用旧版本19.0.3的软件包,而不是新安装的版本21.0.1。
我手动将两个版本字符串更改为21.0.1。现在pip.exe可以正确安装Pillow了。
从现在开始我明白了为什么pip仍然抱怨我使用的是旧版本的pip。

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

4xy9mtcn

4xy9mtcn3#

每个Python安装都可能附带自己的Pip版本。(出于安全原因,某些安装可能会故意排除Pip:例如,当Python包含在Linux发行版中时,它通常会省略Pip,这样用户就不会无意中将有害的东西安装到操作系统所依赖的Python副本中。
从概念上讲,Pip由两部分组成:pip标准库模块,包含在pip.py文件中;和一个pip“wrapper”可执行文件。(在Windows上,这是作为一个实际的.exe文件实现的;在Mac和Linux上,它应该只是一个Python脚本,具有执行权限设置,并且没有.py文件扩展名。) Package 器的目的是运行相应标准库模块中的“主”代码。
在命令行中使用pip将查找并运行PATH环境变量中的第一个 Package 器可执行文件,然后运行相应的Python代码 ,以安装与该 Package 器相关的Python 。因此,它将为任何Python安装第三方库。
在命令行中使用python -m pip将在PATH环境变量中找到并运行无论哪个Python,并指示它在其 * 标准库中找到pip标准库模块 (不直接;它将搜索sys.path,就像任何模块导入一样)并运行它“as a module”。因此,它将为PATH中找到的Python安装第三方库。
在Windows上,在命令行中使用py -m pip将(除非系统配置错误)找到并运行
py可执行文件
*,该文件安装在始终位于PATH上的Windows目录中。这反过来又会让use its own logic在系统上选择一个Python,运行 itspip,然后像以前一样继续。
根据系统的配置方式,这些命令可能不会全部选择相同的Python安装
使用python -m pip可以确保为 * 使用python myscript.py * 运行的相同Python安装库。这对于那些正在编写myscript.py的人来说非常有用,他们需要这些代码来使用将要安装的库,并希望它与任何python一起运行。
对于Windows,需要特别说明的是,pip install --upgrade pip将无法工作This is because升级Pip涉及替换磁盘上的Pip Package 器可执行文件;通过以这种方式运行该命令, Package 可执行文件 * 就是正在运行的程序 *,并且Windows不允许程序在磁盘上替换自己。通过使用python -m pip install --upgrade pippy -m pip install --upgrade pip,避免了这个问题,因为现在 Package 器可执行文件不运行- Python(可能还有py)运行,使用来自pip.py(或缓存的pip.pyc)文件的代码。

相关问题