你好 预期将在机器学习课程中启动一个新主题,我们希望共享该文章的翻译,该文章与ML有相当间接的联系,但对我们博客的订阅者肯定有用。

加拿大开发人员
Mariatta在Twitter上要求使用
python -m pip进行询问,请她讨论此习语并解释其用法。
我最近了解到,您需要编写python -m pip而不是通常的pip安装,但是现在我不记得从谁那里来了。 可能来自@brettsky或@zooba 。 你们是否有博客文章,以便我与读者分享?
-Mariatta( @mariatta
)2019年10月29日( https://twitter.com/mariatta/status/1189243515739561985?ref_src=twsrc%5Etfw )
我不确定我对Mariatta所说的关于
python -m pip的内容 ,但是很有可能是我,因为我要求自2016年以来
就以这种方式编写使用
PyPI安装软件包的说明。 因此,本文应解释什么是
python -m pip以及为什么在启动
pip时应使用它。
什么是python -m pip?
对于初学者,
python -m pip使用您为python语句指定的Python版本执行pip。 因此,/
/usr/bin/python3.7 -m pip
表示您为
/usr/bin/python3.7
的解释器运行
pip 。 如果您不了解
-m
标志的工作原理,则可以阅读
文档 (顺便说一句,它非常有用)。
为什么要使用python -m pip而不是pip / pip3?
您可以说:“好吧,但是为什么我不能只通过运行
pip命令来使用
pip ?”答案是:“是,但是您对此的控制较少。” 我将通过一个示例来解释“减少控制”的含义。
假设我安装了两个版本的Python,例如Python 3.7和3.8(这在使用Mac OS或Linux的人们中很常见,更不用说您可能想使用Python 3.8的事实,并且您已经Python 3.7)。 因此,如果您在终端中键入
pip ,将为该软件包安装哪个Python解释器?
没有更详细的信息,您将不知道答案。 首先,您需要了解PATH中的内容,即
/usr/bin
首先或
/usr/local/bin
(这是安装Python的最常见位置,通常以
/usr/local/
首先)。 因此,您还记得Python 3.7和3.8的安装位置,它们是不同的目录,并且您将首先了解PATH中的内容。 假设您手动安装了这两个软件,也许您的系统上已经预先安装了Python 3.7.3,并安装了Python 3.7.5。 在这种情况下,两个版本的Python都安装在
/usr/local/bin
。 您现在能告诉我现在附有什么
点吗?
您不知道答案。 如果您不知道每个版本的安装时间,并且知道
pip的最新版本已写入
/usr/local/bin/pip
,但您不知道
pip命令将使用哪个解释器。 现在您可以说:“我总是安装最新版本,这意味着将在最后安装Python 3.8.0,因为它比3.7.5还要新。”好的,但是当Python 3.7出现时会发生什么.6?Python 3.8将不再使用您的
点 ,而Python 3.7将不再使用您的
点 。
当您将
python -m pip与所需的特定python解释器一起使用时,所有歧义都会消失。 如果我编写
python3.8 -m pip ,那么我确切地知道将使用哪个
pip ,并且该软件包将为Python 3.8安装(如果我指出python3.7,也会发生同样的事情)。
如果使用Windows,则还有一个额外的动机来使用
python -m pip ,因为它允许
pip进行更新。 主要是因为编写
pip install --upgrade pip时
pip.exe被认为正在运行。 此时,Windows不允许您重新安装
pip.exe 。 但是,如果您执行
python-m pip install --upgrade pip ,则会在启动
python.exe而不是
pip.exe时解决此问题。
在激活的环境中会发生什么?
通常,当我向人们解释本文的本质时,总会有人说:“我一直使用虚拟环境,而这不适用于我。” 好吧,对于初学者来说,使用虚拟环境总是很好! (我将在下一篇文章中解释为什么会这样!)但是,老实说,我仍然会坚持使用
python -m pip ,即使严格地说,这是没有必要的。
首先,如果您使用Windows,则仍要使用
python-m pip,以便可以在您的环境中更新
pip 。
其次,即使您使用其他操作系统,我也会说您仍然需要使用
python-m pip ,因为不管情况如何,它都可以工作。 如果您忘记激活环境,他会警告您错误,并且任何监视您的人员都会采用最佳做法。 就个人而言,我不认为节省10次击键对于不采取良好做法会是不菲的代价。 而且此命令还将帮助您防止编写自动化脚本时出错,如果您忘记激活环境,该脚本将执行明显不正确的操作。
就个人而言,当我使用其工作取决于启动哪个解释器的任何工具时,无论是否激活了虚拟环境,我都始终使用
-m
。 对我来说,了解我使用的是哪个Python解释器始终很重要。
始终使用环境! 不要将所有内容都放在全局解释器中!
当我们谈论如何避免在Python中进行安装时的混乱时,我想强调的是,当我们在本地工作时,我们不应该在全局Python解释器中安装任何东西(容器是完全不同的事情)! 如果这是系统的预装Python,那么如果您安装了操作系统所依赖的某些不兼容版本的库,则实际上将破坏系统。
但是,即使您自己单独安装
python副本,我仍然强烈建议您不要直接在本地开发中安装它。 最终,您将在项目中使用可能相互冲突的各种程序包,并且对项目中的依赖项一无所知。 最好使用环境将各个项目和工具彼此隔离。 Python社区使用两种类型的环境:虚拟环境和conda环境。 甚至还有一种特殊的方式来独立安装Python工具。
如果您需要安装工具
对于独立安装该工具,我建议使用
pipx 。 每个工具都将拥有自己的虚拟环境,以免与其他工具冲突。 因此,如果您只想要一个安装,例如
Black ,则可以工作而不会意外中断
mypy的唯一安装。
如果您需要项目环境(并且不使用conda)
当您需要为项目创建环境时,我个人总是转向
venv和虚拟环境。 它包含在
stdlib Python中,因此始终可以通过
python-m venv使用 (当然,除非您使用的是Debian或Ubuntu,在这种情况下,您可能需要安装
python3-venv apt软件包)。
一段历史:实际上,出于需要使用
python -m pip而不是
pip的相同原因,我实际上删除了Python安装的用于使用
venv创建虚拟环境的旧
pyvenv命令。 也就是说,尚不清楚您使用旧的
pyvenv命令为哪个解释器创建了虚拟环境。 请记住,您不需要激活环境即可使用其中包含的解释器,因为
.venv/bin/python
可以与激活环境并输入
python命令一起工作。
如今,一些开发人员仍然更喜欢
virtualenv ,因为它在Python 2中可用并且具有一些附加功能。 就个人而言,我对其他功能几乎没有兴趣,并且集成了
venv意味着我不需要使用
pipx在每台计算机上安装
virtualenv 。 但是,如果
venv不能
满足您的需求,并且您想要一个虚拟环境,请查看
virtualenv是否满足您的需求。
如果您使用conda
如果使用
conda ,则可以使用
conda环境获得与
venv提供的虚拟环境相同的效果。 我不会讨论在特定情况下是否需要使用conda或venv,但是如果您使用
conda ,那么您知道可以(并且应该)为您的工作创建
conda环境,而不是自己安装一切系统安装。 因此,您可以清楚地了解您的项目具有哪些依赖关系(这是使用
miniconda而不是完整的
anaconda的充分理由,因为前者的体积不到后者的十分之一)。
总是有容器
在容器中工作是根本不处理环境的一种方式,因为您的整个“机器”将变成一个单独的环境。 在容器系统中安装Python之前,您应该能够安全地进行全局安装,以使容器保持简单明了。
我再说一遍,你真的了解本质...
不要在全局Python解释器中安装任何内容! 始终尝试使用环境进行本地开发!我不能再说我有多少次必须帮助某个认为pip安装在一个Python解释器中但实际上安装在另一个Python解释器中的人了。 这个不可估量的金额也适用于人们破坏整个系统或想知道为什么他们无法安装与先前为另一个项目设置的其他东西相抵触的东西等情况的那一刻。 由于他们不必在本地计算机上配置环境。
因此,为了使您和我都能安然入睡,请使用
python-m pip并尝试始终使用环境。