pyenv 安装脚本
curl https://pyenv.run | bash
执行上面这一行脚本就可以安装pyenv
来满足你对 Python 多版本共存以及切换的支持。
pyenv
搭配virtualenv
可以满足你对Python虚拟环境版本的支持。个人感觉pyenv
比conda
更轻量,更推荐使用。
那么上面的脚本到底干了什么事儿呢?
pyenv.run的内容
#!/bin/bash
#
# Usage: curl https://pyenv.run | bash
#
# For more info, visit: https://github.com/pyenv/pyenv-installer
#
index_main() {set -ecurl -s -S -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
}index_main
它去github
获取了另一个脚本并执行,脚本的内容如下:
pyenv-installer 的内容
#!/usr/bin/env bashset -e
[ -n "$PYENV_DEBUG" ] && set -xif [ -z "$PYENV_ROOT" ]; thenif [ -z "$HOME" ]; thenprintf "$0: %s\n" \"Either \$PYENV_ROOT or \$HOME must be set to determine the install location." \>&2exit 1fiexport PYENV_ROOT="${HOME}/.pyenv"
ficolorize() {if [ -t 1 ]; then printf "\e[%sm%s\e[m" "$1" "$2"else echo -n "$2"fi
}# Checks for `.pyenv` file, and suggests to remove it for installing
if [ -d "${PYENV_ROOT}" ]; then{ echocolorize 1 "WARNING"echo ": Can not proceed with installation. Kindly remove the '${PYENV_ROOT}' directory first."echo} >&2exit 1
fifailed_checkout() {echo "Failed to git clone $1"exit -1
}checkout() {[ -d "$2" ] || git -c advice.detachedHead=0 clone --branch "$3" --depth 1 "$1" "$2" || failed_checkout "$1"
}if ! command -v git 1>/dev/null 2>&1; thenecho "pyenv: Git is not installed, can't continue." >&2exit 1
fi# Check ssh authentication if USE_SSH is present
if [ -n "${USE_SSH}" ]; thenif ! command -v ssh 1>/dev/null 2>&1; thenecho "pyenv: configuration USE_SSH found but ssh is not installed, can't continue." >&2exit 1fi# `ssh -T git@github.com' returns 1 on success# See https://docs.github.com/en/authentication/connecting-to-github-with-ssh/testing-your-ssh-connectionssh -T git@github.com 1>/dev/null 2>&1 || EXIT_CODE=$?if [[ ${EXIT_CODE} != 1 ]]; thenecho "pyenv: github ssh authentication failed."echoecho "In order to use the ssh connection option, you need to have an ssh key set up."echo "Please generate an ssh key by using ssh-keygen, or follow the instructions at the following URL for more information:"echoecho "> https://docs.github.com/en/repositories/creating-and-managing-repositories/troubleshooting-cloning-errors#check-your-ssh-access"echoecho "Once you have an ssh key set up, try running the command again."exit 1fi
fiif [ -n "${USE_SSH}" ]; thenGITHUB="git@github.com:"
elseGITHUB="https://github.com/"
ficheckout "${GITHUB}pyenv/pyenv.git" "${PYENV_ROOT}" "${PYENV_GIT_TAG:-master}"
checkout "${GITHUB}pyenv/pyenv-doctor.git" "${PYENV_ROOT}/plugins/pyenv-doctor" "master"
checkout "${GITHUB}pyenv/pyenv-update.git" "${PYENV_ROOT}/plugins/pyenv-update" "master"
checkout "${GITHUB}pyenv/pyenv-virtualenv.git" "${PYENV_ROOT}/plugins/pyenv-virtualenv" "master"if ! command -v pyenv 1>/dev/null; then{ echocolorize 1 "WARNING"echo ": seems you still have not added 'pyenv' to the load path."echo} >&2{ # Without args, `init` commands print installation help"${PYENV_ROOT}/bin/pyenv" init || true"${PYENV_ROOT}/bin/pyenv" virtualenv-init || true} >&2
fi
逐行解释
让AI帮我们解释一下这个脚本,这个脚本是用于安装 pyenv
的 Bash 脚本,pyenv
是一个用来管理多个 Python 版本的工具。脚本首先会检查一些条件,确保环境设置正确,然后从 GitHub 克隆 pyenv
和它的一些插件,并设置适当的路径和权限。
-
设置脚本行为和调试信息
set -e [ -n "$PYENV_DEBUG" ] && set -x
set -e
:如果脚本中某一行命令返回非零值(即出错),则立即退出脚本。set -x
:如果环境变量PYENV_DEBUG
被设置,则开启调试模式,打印每个执行的命令。
-
设置
PYENV_ROOT
if [ -z "$PYENV_ROOT" ]; thenif [ -z "$HOME" ]; thenprintf "$0: %s\n" \"Either \$PYENV_ROOT or \$HOME must be set to determine the install location." \>&2exit 1fiexport PYENV_ROOT="${HOME}/.pyenv" fi
- 如果
PYENV_ROOT
未设置,且HOME
变量也没有设置,脚本会输出错误并退出。 - 如果
HOME
已设置,则默认将PYENV_ROOT
设置为$HOME/.pyenv
。
- 如果
-
颜色化输出函数
colorize() {if [ -t 1 ]; then printf "\e[%sm%s\e[m" "$1" "$2"else echo -n "$2"fi }
colorize
函数用于输出带有颜色的文本,支持终端支持颜色时输出颜色,不支持时输出普通文本。
-
检查
PYENV_ROOT
目录是否已存在if [ -d "${PYENV_ROOT}" ]; then{ echocolorize 1 "WARNING"echo ": Can not proceed with installation. Kindly remove the '${PYENV_ROOT}' directory first."echo} >&2exit 1 fi
- 如果
PYENV_ROOT
目录已存在,脚本会输出警告并退出,要求用户先删除该目录才能继续安装。
- 如果
-
定义
failed_checkout
和checkout
函数failed_checkout() {echo "Failed to git clone $1"exit -1 }checkout() {[ -d "$2" ] || git -c advice.detachedHead=0 clone --branch "$3" --depth 1 "$1" "$2" || failed_checkout "$1" }
failed_checkout
:如果 Git 克隆失败,会输出错误信息并退出。checkout
:如果目标目录不存在,则使用git clone
命令从指定 Git 仓库克隆代码。支持克隆指定分支($3
)并且使用浅克隆(--depth 1
)。
-
检查是否安装 Git
if ! command -v git 1>/dev/null 2>&1; thenecho "pyenv: Git is not installed, can't continue." >&2exit 1 fi
- 如果系统没有安装
git
,脚本会输出错误并退出。
- 如果系统没有安装
-
检查
USE_SSH
配置if [ -n "${USE_SSH}" ]; thenif ! command -v ssh 1>/dev/null 2>&1; thenecho "pyenv: configuration USE_SSH found but ssh is not installed, can't continue." >&2exit 1fi# `ssh -T git@github.com' returns 1 on successssh -T git@github.com 1>/dev/null 2>&1 || EXIT_CODE=$?if [[ ${EXIT_CODE} != 1 ]]; thenecho "pyenv: github ssh authentication failed."exit 1fi fi
- 如果环境变量
USE_SSH
设置了,脚本会检查系统是否安装了ssh
,如果没有安装,退出。 - 然后,使用
ssh
测试 GitHub 的 SSH 连接,确保 SSH 密钥设置正确。
- 如果环境变量
-
设置 GitHub 地址(基于是否使用 SSH)
if [ -n "${USE_SSH}" ]; thenGITHUB="git@github.com:" elseGITHUB="https://github.com/" fi
- 如果使用 SSH,设置 GitHub 地址为
git@github.com:
,否则使用 HTTPS。
- 如果使用 SSH,设置 GitHub 地址为
-
克隆
pyenv
和相关插件checkout "${GITHUB}pyenv/pyenv.git" "${PYENV_ROOT}" "${PYENV_GIT_TAG:-master}" checkout "${GITHUB}pyenv/pyenv-doctor.git" "${PYENV_ROOT}/plugins/pyenv-doctor" "master" checkout "${GITHUB}pyenv/pyenv-update.git" "${PYENV_ROOT}/plugins/pyenv-update" "master" checkout "${GITHUB}pyenv/pyenv-virtualenv.git" "${PYENV_ROOT}/plugins/pyenv-virtualenv" "master"
- 克隆
pyenv
主仓库以及其插件:pyenv-doctor
、pyenv-update
、pyenv-virtualenv
。
- 克隆
-
提醒用户配置
pyenv
到 PATHif ! command -v pyenv 1>/dev/null; then{ echocolorize 1 "WARNING"echo ": seems you still have not added 'pyenv' to the load path."echo} >&2{ # Without args, `init` commands print installation help"${PYENV_ROOT}/bin/pyenv" init || true"${PYENV_ROOT}/bin/pyenv" virtualenv-init || true} >&2 fi
- 如果
pyenv
没有被正确添加到 PATH,脚本会提醒用户,并尝试运行pyenv init
和pyenv virtualenv-init
来显示如何配置。
- 如果
总结
这个脚本的作用是为用户自动安装 pyenv
和相关插件。它会确保环境符合安装要求,检查 git
是否可用,确认用户是否有正确的 SSH 配置,并从 GitHub 克隆 pyenv
和其插件。然后它会提醒用户如何正确配置 pyenv
,以便在系统中使用它。如果某些条件不满足,脚本会提前退出并给出相应的错误提示。
我们可以通过export PYENV_ROOT="/data/pyenv"
设置PYENV_ROOT
把pyenv
安装到指定的目录,从而避免日积月累各种依赖包塞满系统盘。