【问题标题】:Difference between pip3 and python3 -m pippip3 和 python3 -m pip 的区别
【发布时间】:2017-05-09 11:50:23
【问题描述】:

我正在尝试使用 pip 和 python3 安装一些软件包。我使用的是 MacOS,所以默认情况下,当我运行 pip 时,它使用我的 Python 2 版本。

我已经能够使用以下方法在 python 3 中安装一个包:

$ pip3 install package_name

但是,我可以通过(至少看起来)做同样的事情:

$ python3 -m pip install package_name

不知道pip3python3 -m pip 是不是效果一样。

【问题讨论】:

  • 不是特定于 Python,但是... 你的 shell 可能表现不同,因为它正在查找两个不同的名称。有时,新软件安装在/usr/local/ 或更奇怪的地方,对典型的$PATH 或文件系统层次结构的唯一让步是手工制作的符号链接,如/usr/bin/python3 -> /opt/experimental/python3.2-local-myedit/bin/python。通常在这些设置中,只有像 pythonperl 这样的“星”二进制文件被符号链接,而从相关二进制文件(如 pip)到手册页的所有其他内容都会将用户发送到操作系统安装媒体上的任何内容。跨度>
  • 个人脚本、shell 函数和别名也会出现类似的错误。示例:在运行 python 之前获取一些配置文件,但不是 pip

标签: python python-3.x pip


【解决方案1】:

它们是一样的。如果您查看 bin 文件夹中的 pip3 文件,它会调用 pip 模块中的 main 函数。

pip3 install package_name 运行 bin 文件夹中的 pip3 文件:

# bin/pip3 
# or bin/pip if using pip install package_name

import re
import sys

from pip import main

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(main())

python3 -m pip install package_name 运行pip 模块的__init__.py 文件。

# pip/__init__.py
if __name__ == '__main__':
    sys.exit(main())

它们都运行相同的main() 函数

【讨论】:

  • 谢谢,我知道怎么看pip3($ less /usr/local/bin/pip3)的代码,但是你怎么知道python3 -m pip install ....使用的代码?
  • 正如 Kevin J. Chase 所暗示的,shell 可能正在查找两个不同的名称。有什么方法可以确保您所说的内容?我的意思是如何知道使用$ python3 -m pip install ... 执行的代码
  • python3 -m module 将运行模块的__init__.py 文件。更详细的解释见这个SO post
  • 除非有一些奇怪的设置。 pip3python3 的路径应该是相同的 bin 文件夹。在这种情况下,他们会调用相同的 pip 模块。
  • @tihorn 谢谢你的提示,我刚刚被那些“奇怪的设置”之一咬了。 pip3 的路径是/usr/bin/pip3,python3 的路径是~/anaconda3/bin/python3。我正在使用 pip3 安装软件包,然后 python3 告诉我ModuleNotFound
【解决方案2】:

正如@tihorn 所说,pip3python3 -m pip 应该是一样的。至少有一个例外:如果它们不在同一路径中。我有以下设置:

$ which pip3
/usr/bin/pip3
$ which python3
/home/username/anaconda3/bin/python3

使用 pip3 安装模块并使用pip3 freeze 验证后,在运行python3 my_script.pypython3 -c 'import my_module' 时无法访问它们。我收到了 ModuleNotFound 错误。

【讨论】:

    【解决方案3】:

    其他答案在技术上是正确的,但对于 为什么 Python 有 pip3python3 -m pip 有点不清楚:

    如果您的机器上有多个 Python 安装,使用 pip3 全局安装包可能不明确

    许多人在升级计算机操作系统后最终安装了多个 Python。操作系统升级通常会安装新的 Python,但不会冒清除旧 Python 和破坏计算机上现有程序的风险。

    出于这些原因,在我自己的计算机上,我总是使用特定版本进行安装,例如:python3.8 -m pip。当我编写 Makefile 或构建脚本以分发给其他人时,我默认使用 python3 -m pip,但让用户可以选择将 python3 替换为他们自己的解释器路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      相关资源
      最近更新 更多