当前位置: 首页 > 面试题库 >

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

段晨
2023-03-14
问题内容

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


问题答案:

2014年

他们做的完全一样。实际上,用于分发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')()

它正在调用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

因此,返回的入口点是模块中的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



 类似资料:
  • 问题内容: 我正在使用读取csv文件的两列,然后将值分配给字典。这些列包含数字和字母字符串。有时在某些情况下单元格为空。在我看来,应读取但应分配该字典条目的值。当然,由于它具有空值,因此更能描述一个空单元格,而nan只是说读取的值不是数字。 我的理解正确吗,和之间有什么区别?为什么分配而不是? 另外,我的字典检查是否有任何空单元格一直在使用: 但这给了我一个错误,说我不能使用此检查v。我猜这是因为

  • 问题内容: 和之间有适用的区别吗? 从Python文档中: :返回字典的(键,值)对列表的副本。 :在字典的(键,值)对上返回迭代器。 如果我运行下面的代码,每个似乎都返回对同一对象的引用。我缺少任何细微的差异吗? 输出: 问题答案: 这是演变的一部分。 最初,构建了一个真正的元组列表,并将其返回。这可能会占用大量额外的内存。 然后,一般将生成器引入该语言,然后将该方法重新实现为名为的迭代器-生成

  • 问题内容: 我知道是软件包的软件包管理器。但是,我看到网站上的安装用于安装IPython。 我可以用来安装吗?我已经拥有了为什么还要用作另一个python软件包管理器pip? 和之间有什么区别? 问题答案: 引用来自Conda博客: 参与python世界已经很长时间了,我们都知道,,但是这些工具不能满足我们所有的特定要求。主要问题是它们专注于Python,而忽略了非Python库依赖项,例如HDF

  • 问题内容: search()和Python 模块中的match()函数和有什么区别?re 我已经阅读了文档(当前文档),但是我似乎从未记得它。我一直在查找并重新学习它。我希望有人会用示例清楚地回答它,以便(也许)它会贴在我的头上。或者至少我将有一个更好的地方来回答我的问题,并且重新学习它所花的时间会更少。 问题答案: 锚定在字符串的开头。这与换行无关,因此它与在模式中使用的方式不同。 如重新匹配文

  • 问题内容: 这两个代码片段之间有什么区别?使用: 使用isinstance(): 问题答案: 总结答案的内容,迎合继承(派生类的实例也是基类的实例),而检查的相等性type则不(要求类型的标识并拒绝实例)子类型,又称为AKA子类)。 通常,在Python中,你当然希望你的代码支持继承(因​​为继承非常方便,因此停止使用你的代码来使用它会很糟糕!),因此它比检查的身份要糟糕得多,因为它无缝地支持s遗

  • 问题内容: 据我对Docker的了解,它是用于虚拟环境的工具。用他们的术语来说,它叫做“容器化”。这或多或少是Python的virtualenv所做的。但是,您可以 在 Docker中使用virtualenv 。那么,它是虚拟环境内部的虚拟环境吗?我对这甚至如何工作感到困惑,所以有人可以澄清一下吗? 问题答案: virtualenv仅封装Python依赖项。Docker容器封装了 整个OS 。 借

  • 问题内容: 我最近遇到了这种语法,但我没有意识到两者之间的区别。 如果有人可以告诉我与众不同,我将不胜感激。 问题答案: 一个类可以自由选择以任何方式实现比较,并且可以选择与None进行比较意味着某种意义(这实际上是有道理的;如果有人告诉你从头开始实现None对象,那么你将如何获得它来比较True?反对自己?)。 实际上,由于自定义比较运算符很少见,因此差异不大。但是你应该使用般规则。

  • 问题内容: 对列表进行排序并保存排序后的列表,同时返回列表的排序后的副本,而不更改原始列表。 但是什么时候使用哪个呢? 哪个更快?又快多少? 之后可以检索列表的原始位置吗? 问题答案: 返回一个新的排序列表,而原始列表不受影响。就地对列表进行排序,使列表索引突变,然后返回None(就像所有就地操作一样)。 适用于任何可迭代的对象,而不仅仅是列表。字符串,元组,字典(你将获得键),生成器等,返回包含