在MacOS上设置Python 3的正确和错误方式(2019年,2020年更新)

2020-09-09 20:20:56

有很多方法可以配置Python3.tl;dr如果您正在寻找快速的答案,请跳到本部分,为您的成功做好准备。

当我准备前往美国PyCon时,我一直在尝试Python开发。(如果你也要去那里,并想分享你的Python故事,请告诉我!)。当我安装一个模块进行修补时,我得到了一个提示,我需要尽快安装Python3。

$pip安装Todoist-python弃用:Python 2.7将于2020年1月1日寿终正寝。请升级您的Python,因为Python2.7韩元将不会在该日期之后维护。未来版本的pip将不再支持Python2.7。

所以,我做了我们每个人都会做的事情,在谷歌上四处寻找更新我的开发环境的指南,我的开发环境在Mac(MacOS操作系统,以前称为OSX)上运行。令我惊讶的是,我发现只有几篇StackOverflow帖子,他们给我指出了部分解决方案。下面是如何在不破坏MacOS操作系统内置的任何东西的情况下设置您的环境的完整故事。

给大家一句话:如果您希望以正确的方式安装Python3,请跳到该部分。我将从其他看似正确但不是好主意的方式开始。如果您时间不够用,只想要推荐的方法,请跳到本文末尾。

MacOS附带的Python版本远远落后于Python推荐用于开发的版本。正如XKCD所指出的,Python运行时有时也具有滑稽的挑战性。

那么,我们的计划是什么呢?我的计算机上已经有几十个Python解释器,我不知道如何有效地管理它们。我不想下载最新版本,把它移到我的路径中,然后就到此为止(或者使用BREW install python3,它会做类似的事情)。我想这会以一种我不知道如何解决的令人沮丧的方式导致线路中断。我认为最好的前进道路是撕毁和替换我正在运行的任何版本的Python,以便清楚而明确地切换到最新和最好的版本。

关于如何使Python3成为我系统上的默认Python,我的第一个想法是移动旧版本并添加新版本:

#我认为可行的方法#首先,我将找到我的python二进制文件$其中python/usr/bin/python#下一步,我将把它移动到一个未使用的名称$sudo MV/usr/bin/python/usr/bin/python2#最后,我将把新的二进制文件移动到以前的路径$sudo MV$PATHTOBINARY/python3/usr/bin/python3/usr/bin/python2#最后,我将把新的二进制文件移动到以前的路径$sudo MV$PATHTOBINARY/python3/usr/bin/python。

该模式遵循/usr/bin/在主要Python版本之间通常执行的操作,但我很快意识到这是一个错误的举动:

谢天谢地,MacOS保护了我,使我没有打破一些我不完全理解的东西。进一步的研究证明,这正是我们不应该做的。

现在我们知道不该做什么了,让我们看看我们能做些什么。当我们考虑MacOS上应用程序的通用安装模式时,有几种选择。

Python的网站上有一个MacOS Python3安装程序,我们可以下载并使用。如果我们使用软件包安装,/usr/local/bin/中将提供python3填充。

别名是必须的,因为/usr/bin/can中存储的Python二进制文件不能更改。别名的好处在于它特定于我们的命令行shell。因为我默认使用zsh,所以我将以下内容放入.zshc文件中:

如果您使用的是默认的Bash shell,则可以将相同的文本附加到.bashrc:

这个策略是有效的,但是对于将来对Python进行更新来说并不理想。这意味着我们必须记得查看网站并下载新文件,因为Python不包含命令行更新方式。

Homebrew项目为MacOS提供了一个免费的开源软件包管理器,很多人都依赖它。它给苹果用户一种类似于apt-get或yum的能力。如果您是Homebrew用户,您可能已经安装了Python。要快速检查,请运行以下命令:

如果Python出现在该命令下,则说明它已安装。它是什么版本的?让我们检查一下:

$BREW INFO python python:稳定的3.7.3(瓶装),HEAD解释型交互式面向对象编程语言https://www.python.org//usr/local/cella/python/3.7.2_1(8,437个文件,118MB)*##不包含其他输出##。

好的,太好了!Homebrew维护人员已经更新了默认的Python瓶子以指向最新版本。由于Homebrew维护人员在更新发行版方面比我们大多数人更可靠,因此我们可以通过以下命令使用Homebrew的Python 3版本:

现在,我们希望(从上面)将我们的别名指向Homebrew管理的Python副本:

#如果添加了以前的别名,请使用文本编辑器将该行更新为以下别名python=/usr/local/bin/python3。

要确保上面的路径指向HomeBREW在我们的环境中安装Python的位置,我们可以运行BREW INFO Python并查找路径信息。

这种使用Homebrew来管理我们的Python环境的方法是一个很好的起点,而且在当时对我来说是有意义的。

对于任何刚接触Python的人来说,从Python 3开始是有意义的。但是我们这些仍然需要Python 2的人-例如,为一个仅在Python 2中提供的Python项目做贡献-可以继续使用/usr/bin/python中提供的默认MacOS Python二进制文件:

在任何时候,我们都可以从shell的配置文件中删除别名,以恢复使用系统上的默认Python副本。

Pip命令是专门针对Python包的默认包管理器。虽然我们将默认的Python命令更改为版本3,但如果pip命令在以前的版本上,则必须单独为其命名。首先,我们需要检查我们使用的是什么版本:

#请注意,这是来自/Library/Python/2.7/site-Packages/pip-19.0.3-py2.7.egg/pip(python 2.7)的大写V(非小写)$pip-V pip 19.0.3。

为了确保我们重新安装与新版本的Python兼容的软件包,我们将使用另一个别名指向兼容版本的pip。由于在这种情况下我们使用Homebrew作为软件包管理器,因此我们知道它在安装Python 3时安装了PIP3。默认路径应该与Python 3相同,但我们可以通过让shell查找来确认这一点:

现在我们知道了位置,我们将像前面一样将其添加到shell配置文件中:

$ECHO";别名pip=/usr/local/bin/PIP3";>;>;~/.zshc#或Bash$ECHO";别名pip=/usr/local/bin/pip3";>;>;~/.bashrc。

最后,我们可以通过打开新shell或重置当前shell并查看我们所指向的内容来确认运行pip指向PIP3:

#此命令在不退出会话的情况下重新加载当前shell#或者,退出shell并启动新的shell$exec$0#现在我们可以查看pip指向我们$哪个pip pip:aliased to/usr/local/bin/pip3。

我们可以避免使用Homebrew更新pip,但这需要Python文档中更长的教程。

在要求对本文进行技术审查时,Mohe Zadka警告我说,我的解决方案可能会导致不可靠的想法,即运行哪种Python过于依赖于shell加载别名。我知道摩西熟悉Python,但我不知道的是,他是许多Python教程的作者,而且即将出版一本关于MacOS上的Python开发的书。他帮助40名同事遵循一个核心原则,在MacOS系统上安全一致地开发Python:

所有Python开发的基本前提是决不使用系统Python。您不希望Mac OS X&39;默认Python是您永远不想关心的默认Python。";您不会希望Mac OS X';默认Python不是您想要的。";您不想让默认Python成为您永远不关心的Python。";

我们如何才能不再关心违约问题呢?Moher推荐使用pyenv来管理Python环境(有关配置pyenv的更深入信息,请参阅本文)。该工具将管理多个版本的Python,被描述为简单、不引人注目,并且遵循Unix的单一用途工具的传统,这些工具只做一件事。

虽然有其他安装选项可用,但最简单的入门方式是使用HomeBREW:

$pyenv install 3.7.3 python-build:使用HOMEBREW python-build中的OpenSSL 1.0:使用HOMEBREW中的readline下载Python-3.7.3.tar.xz...。->;https://www.python.org/ftp/python/3.7.3/python-3.7.3.tar.xz安装Python-3.7.3...。##未包含进一步的输出##。

现在已经通过pyenv安装了Python 3,我们希望将其设置为pyenv环境的全局默认版本:

Pyenv的力量来自于它对我们的炮弹路径的控制。为了使其正常工作,我们需要将以下内容添加到我们的配置文件中(对于我来说是.zshc,对于您来说可能是.bash_profile):

$echo-e';如果命令-v pyenv 1>;/dev/null 2>;&;1;则\n返回";$(pyenv init-)";\nfi';>;>;~/.zshc。

在该命令之后,我们的点文件(对于zsh为.zshc,对于Bash为.bash_profile)应该包含以下行:

我们还需要删除在上述部分中使用的别名,因为它们会阻止正确使用pyenv。删除它们后,我们可以确认pyenv正在管理我们的Python 3版本:

#我从重置当前shell开始#或者,启动一个新的终端实例$exec$0$,其中python/users/mbbroberg/.pyenv/shims/python$python-V Python 3.7.3$pip-V pip 19.0.3来自/Users/mbbroberg/.pyenv/versions/3.7.3/lib/python3.7/site-Packages/pip(python 3.7)。

现在我们可以肯定地知道,我们正在使用Python3.7.3,pip将与它一起更新,而不需要在版本之间进行任何手动别名。使用Mohe推荐的使用版本管理器(Pyenv)使我们能够轻松地接受未来的升级,而不会对我们在给定时间运行哪个Python感到困惑。

当您熟悉了此工作流后,您可以使用pyenv来管理多个版本的Python。对于依赖性管理来说,使用虚拟环境也是必不可少的。我在文章中提到了如何使用内置venv库,Mohe推荐使用Virtualenvwrapper来管理虚拟环境。

如果您刚刚开始在MacOS上进行Python开发,请进行必要的配置以确保您从一开始就使用正确的Python版本。安装Python3,无论是否带有Homebrew,并使用别名都可以让您开始编码,但从长远来看,这不是一个好策略。使用pyenv作为一个简单的版本管理解决方案,让您有一个良好的开端。