python3 -m pip install VS pip3 install

12

我通常使用pip install(因为我认为这与pip3 install相当,因为我只在环境中安装了python3)来安装软件包。但我最近听说python3 -m pip install更好。为什么?


有一个类似的问题https://stackoverflow.com/questions/56940665/pip-install-vs-python3-m-pip-install,但这更像是一个调试请求。他的问题是“pip使用Python 2解释器,但使用已安装给Python 3的模块”。 - F.S.
2个回答

9
我建议不要直接调用任何pip somecommand (或pip3)脚本。相反,更安全的方法是显式地为特定的Python解释器调用pip的可执行模块,形式如path/to/pythonX.Y -m pip somecommand
这样做有很多优点,例如:
  • 明确了将为哪个Python解释器pip-installed项目(Python2还是3,在虚拟环境内还是外部等)
  • 对于虚拟环境,可以在不激活它的情况下pip-install(或进行其他操作):path/to/venv/bin/python -m pip install SomeProject
  • 在Windows下,这是升级pip本身的唯一安全方式path\to\venv\Scripts\python.exe -m pip install --upgrade pip
但是,如果一切都完美设置,那么python3 -m pip install SomeProjectpip3 install SomeProject应该做完全相同的事情,但是有太多情况会出现设置问题而导致事情没有按预期工作,用户感到困惑(正如在此平台上关于此主题的许多问题所示)。

参考文献


在Mac / Unix系统上,如果只安装了一个Python版本在环境中,可以安全地使用“pip install”吗? - F.S.
我认为你的 SomeProject 应该改成 SomePackage - muyustan
@muyustan 我故意使用这个术语来避免混淆“分发包”和“导入包”的概念。这两者都不是应该提供给_pip_的正确术语。SomeProject 是在 PyPI 上发布的项目。它可能有多个版本。每个版本发布可能有多个分发包(_sdist_,_wheel_)。每个分发包可能包含多个可导入的顶级模块或包。-- https://packaging.python.org/glossary/#term-distribution-package -- 我试图在这里(https://sinoroc.gitlab.io/kb/python/packaging.html)简单地总结一下(很差劲)。 - sinoroc
@sinoroc,我猜我惹错人了 :) 我对这些话题的信息不是很多,你的链接看起来不错,我会仔细检查它们。 - muyustan
1
@Chris 是的,一些例子不会有坏处。在这种情况下,我想到了 setuptools 项目。它有两个 _顶级包_:setuptoolspkg_resources(显然还有一个 _顶级模块_:easy_install)。 - sinoroc
显示剩余2条评论

3

这是相同的事情。

python3 -m pip install 在 python 中调用 pip 模块,而 pip install 直接调用 pip。

唯一选择第一种方法的原因是,为了使用第二种方法,您需要在环境变量中设置 pip(对于 Windows)。在较早版本的 Python 中,安装时不会自动执行此操作,而是必须手动执行。这就是为什么在许多指南中,您可能会看到他们使用第一种语法进行指导(因为它始终有效,只要您的环境变量中有 python3。对于 Linux/Mac 操作系统没有任何区别。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接