Brett Cannon:介绍Unix的Python启动器

247 阅读5分钟

问题所在

假设你的机器上安装了不止一个版本的 Python。python3 指向哪个版本?如果你说,"最新的版本",你可能真的错了。这是因为python3 指向了你安装的最后一个 Python 版本,而不一定是最新的;python3 通常在你安装某个版本的 Python 时被覆盖。

当你只是想用最新的 Python 版本工作时,这就有点恼火了 (例如,创建一个新的虚拟环境)。如果有一个命令总是使用&aposs安装的最新版本的Python,那就很方便了 ...

解决办法

事实证明,Windows的Python安装在十年前就为这个烦恼提供了一个解决方案:Python Launcher for Windows。通过一个名为py 的命令,你可以得到最新的 Python 版本,并方便地列出 Windows 机器上所有已知的 Python 安装(当python3 离开PATH 时,它也是在Windows 上python.org 安装中启动 Python 的默认方法,尽管最新的 PSFWindows Store 安装不是这样的)。作为一个工作中的Windows用户,我发现这个命令相当方便,并且在我在macOS或Linux下工作的时候都很想念它。这感觉很奇怪,我决定对这个问题做点什么。

于是三年多前,我开始用Rust重新实现Python Launcher for Unix。2021年7月24日,我推出了Python Launcher for Unix的1.0.0版本(感谢Kushal DasDusty Phillips仔细检查了我的Rust代码)。这在 Unix 上提供了一个py 命令,它将永远使用最新的 Python 版本。这意味着,如果你运行:

py -m venv .venv

你将会得到一个使用最新版本的Python的虚拟环境,可以在$PATH 。仅仅就这一个用途而言,这个命令就出奇地有用。当你只是想为你所安装的最新版本的 Python 提供一个 REPL 时,它也是很好的。

你还可以设置$PY_PYTHON 环境变量来指定你想默认使用的 Python 版本。例如,假设你安装了 CPython 3.10.0.rc1,但你想在日常工作中使用 Python 3.9。你可以设置PY_PYTHON = 3.9 ,这将使py 使用python3.9

你可以使用py --list 来查看你安装了哪些 Python 版本。

 3.9 │ /usr/local/bin/python3.9                
 3.8 │ /usr/local/opt/python@3.8/bin/python3.8 
 3.7 │ /usr/local/opt/python@3.7/bin/python3.7 
 2.7 │ /usr/bin/python2.7 

所有这些都反映了 Python Launcher for Windows 所做的事情 (尽管列表的格式不同)。还有一些其他的东西也被实现了,但由于Python 2已经在我们后面了,这些东西就不那么有用了 (例如,你可以指定一些限制,如你想要的Python的主要版本以及major.minor版本),但如果你是从Windows来的,那么你就可以从py 命令中得到你所习惯的大部分_东西_(例如,配置文件没有实现,我没有用-0 作为--list 的一个别名)。

额外功能

对于我的工作流程

由于我写这个工具是为了方便,我决定把事情做得更大一些,并增加一些好处,以更适合我的个人工作流程。

首先,如果你在当前目录或任何父目录下的.venv 目录中拥有一个虚拟环境,它将被用来代替&aposs安装的最新版本的Python。这意味着你不需要再激活你的虚拟环境 (尽管启动器也会使用任何已激活的虚拟环境)!

py -m venv .venv
py -c "import sys; print(sys.executable)"

然后我可以继续使用-m 来使用安装在虚拟环境中的工具,例如py -m pip 也没有问题。

这对像我这样的Starship用户来说有一个令人惊讶的好处。通过将用于获取 Python 版本的 Python 二进制文件设置为py ,Starship 将告诉我在运行 Python Launcher 时将使用哪个版本的 Python。加入文件夹检测.venv ,现在我可以让 Starship 告诉我一个目录的虚拟环境是什么版本。关于这个主题的FAQ 条目涵盖了如何更新你的starship.toml 以使这一切正常工作。

我也是一个鱼壳用户,所以我它创建了标签完成。它们的好处是它们是动态的,所以它们将准确地反映在你的机器上。

对于其他人的工作流程

我也设法做了一些事情,根据他们的工作流程来帮助别人。

作为我创建的第一个严肃的CLI工具,我决定创建一个手册页(从一个Markdown文件,感谢pandoc)。我也比平时更认真地对待更新日志,所以感谢scrivNed Batchelder对工具做了一些修改,让我几乎把整个发布过程自动化。

感谢Trey HunnerJeff TriplettBen SpauldingCarol WillingLorena Mesa作为beta测试者,他们恰好是pyenv的用户,因为他们贡献了一个FAQ条目,说明如何设置,使$PY_PYTHON 环境变量被设置为pyenv被设置为使用的Python版本。

我也碰巧一直想给Nushell一个认真的尝试,所以我继续想出了一个单行代码,可以创建一个Python版本的表格

启动器做什么......以图片的形式

为了帮助理解 Python Launcher for Unix 在选择使用哪个 Python 解释器时的整体流程,我使用Graphviz 创建了一个流程图。

alt

如何安装

如果你对安装Python Launcher for Unix感兴趣,有一堆选项,在README中都有介绍。我设法在Homebrew/Linuxbrew中得到了一个公式Bernát Gábor很好地创建了一个Arch AUR包。我有预先建立的二进制文件,用于。

  1. RISC-V Linux
  2. AArch64 Linux
  3. x86-64 Linux
  4. 苹果硅
  5. x86-64 macOS
  6. x86-64 NetBSD

基本上所有的平台,我都可以在GitHub Actions下轻松进行,或者 直接在我的macOS机器上构建。如果你从Rust安装了cargocargo install python-launcher 也可以使用(尽管你会得到额外的功能,如man page和fish tab completions)。

启动器不做什么?

需要指出的一个关键问题是,Python Launcher for Unix并不意味着可以在所有你想启动 Python 的情况下使用。例如,如果你知道你想使用的 Python 的路径,那么就直接启动它。如果你对使用何种 Python 解释器有非常具体的要求,也是如此 (例如,在 macOS 上的框架构建或各种 bitness 构建)。启动器纯粹是一种便利,而不是要成为所有东西的启动器;它不应该在Docker容器中结束。

否则我希望你们中的一些人发现它是有用的!