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 在 命令行工具
31KB
633 行
pyenv-python
一个比 pyenv 更快的 pyenv shim。
用法
这个 python
shim,即 $CARGO_HOME/bin/python
,加载速度比 Bash 编写的 pyenv
的 python
shim 快得多。
当在 Python 目录中运行 CLI 脚本时,这非常有帮助,因为运行 CLI 脚本的时间通常小于 pyenv
查找 python
的时间。
例如,使用 starship
,每次进入 Python 目录时都会运行 python --version
来显示提示符上的当前 Python 版本,但如果 pyenv
的 python
shim 需要 ~1 秒,则会使提示符非常慢。使用这个 python
shim,运行 python --version
的时间几乎不可察觉。
快速脚本调用
对于所有全局安装程序,如通过 pip install
,pyenv
将 shim 文件放置在 $PYENV_ROOT/shims
,该文件位于 $PATH
中。
这个 shim 必须通过 pyenv
调用实际脚本,这使得每个脚本的启动都非常慢,即使是简单的 --help
命令,每个脚本也需要增加 1 秒钟的时间。
作为解决方案,pyenv-python
的 python
可执行文件支持无开销地调用脚本。如果 python
被链接到 script
,那么当运行 ./script
时,它会调用 python script
,其中 script
应该在真实 python
的同一目录下。也就是说,如果 python
是真实的 python
可执行文件,那么 ./script
会调用 python ""$(dirname "$(which python)")"/script
。
安装的 python
脚本通常安装在 python
的同一目录下,这使得在没有 pyenv
开销的情况下调用脚本变得非常容易。
这也可以用于其他非 python
命名的二进制文件,如 python2
或 python3
。
性能
在我的本地计算机上,$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
包装器包装 pyenv
的 python
或系统 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