#python #script #shim #version #faster #directory #pyenv

bin+lib pyenv-python

一个比 pyenv 更快的 pyenv shim

6 个版本 (3 个重大更新)

0.4.0 2021年7月27日
0.3.1 2020年10月25日
0.2.0 2020年9月28日
0.1.1 2020年5月21日

#2556命令行工具

MIT 许可证

31KB
633

pyenv-python

一个比 pyenv 更快的 pyenv shim。

用法

这个 python shim,即 $CARGO_HOME/bin/python,加载速度比 Bash 编写的 pyenvpython shim 快得多。

当在 Python 目录中运行 CLI 脚本时,这非常有帮助,因为运行 CLI 脚本的时间通常小于 pyenv 查找 python 的时间。

例如,使用 starship,每次进入 Python 目录时都会运行 python --version 来显示提示符上的当前 Python 版本,但如果 pyenvpython shim 需要 ~1 秒,则会使提示符非常慢。使用这个 python shim,运行 python --version 的时间几乎不可察觉。

快速脚本调用

对于所有全局安装程序,如通过 pip installpyenv 将 shim 文件放置在 $PYENV_ROOT/shims,该文件位于 $PATH 中。
这个 shim 必须通过 pyenv 调用实际脚本,这使得每个脚本的启动都非常慢,即使是简单的 --help 命令,每个脚本也需要增加 1 秒钟的时间。

作为解决方案,pyenv-pythonpython 可执行文件支持无开销地调用脚本。如果 python 被链接到 script,那么当运行 ./script 时,它会调用 python script,其中 script 应该在真实 python 的同一目录下。也就是说,如果 python 是真实的 python 可执行文件,那么 ./script 会调用 python ""$(dirname "$(which python)")"/script

安装的 python 脚本通常安装在 python 的同一目录下,这使得在没有 pyenv 开销的情况下调用脚本变得非常容易。

这也可以用于其他非 python 命名的二进制文件,如 python2python3

性能

在我的本地计算机上,$CARGO_HOME/bin/python --version 的运行速度大约是 $PYENV_ROOT/shims/python --version 的 23 倍。

pyenv-python on  master is 📦 v0.4.0 via 🦀 v1.53.0 took 8s
 hyperfine '$CARGO_HOME/bin/python --version' '$PYENV_ROOT/shims/python --version'
Benchmark #1: $CARGO_HOME/bin/python --version
  Time (mean ± σ):      11.6 ms ±   1.6 ms    [User: 1.0 ms, System: 10.3 ms]
  Range (min … max):    10.0 ms …  19.9 ms    120 runs

Benchmark #2: $PYENV_ROOT/shims/python --version
  Time (mean ± σ):     258.4 ms ±   6.3 ms    [User: 18.5 ms, System: 213.7 ms]
  Range (min … max):   249.1 ms … 273.3 ms    10 runs

Summary
  '$CARGO_HOME/bin/python --version' ran
   22.19 ± 3.09 times faster than '$PYENV_ROOT/shims/python --version'

安装

它刚刚发布到 crates.io,所以您需要从 rustup 安装 cargo

然后 cargo install pyenv-python 将安装 python 包装器。为了使此 python 包装器包装 pyenvpython 或系统 python$CARGO_HOME/bin 必须在 $PATH 中其他任何 python 之前。

python 包装器还支持一些其他命令。

  • python --path 打印将要执行的 python 或脚本的路径。
  • python --dir 打印将要执行的 python 或脚本的目录,即 dirname $(python --path)
  • python --prefix 打印将要执行的 python 或脚本的目录前缀,即 dirname $(python --dir)。这与 python --c 'import sys; print(sys.prefix)' 打印的内容相同。
  • python --which 打印将使用哪个 Python 运行的命令,并解释为什么使用那个 Python。

这些额外的命令与实际的 python 不兼容,但它们不会与任何实际的 python 命令冲突,并且对于检查来说非常有用。以前有一个单独的 python-path 可执行文件执行现在 python --path 所做的操作,但有一个可执行文件要简单得多。

依赖关系

~0.5–8.5MB
~66K SLoC