pyenv 安装脚本解读
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 -e
curl -s -S -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
}
index_main
它去github
获取了另一个脚本并执行,脚本的内容如下:
pyenv-installer 的内容
#!/usr/bin/env bash
set -e
[ -n "$PYENV_DEBUG" ] && set -x
if [ -z "$PYENV_ROOT" ]; then
if [ -z "$HOME" ]; then
printf "$0: %s\n" \
"Either \$PYENV_ROOT or \$HOME must be set to determine the install location." \
>&2
exit 1
fi
export PYENV_ROOT="${HOME}/.pyenv"
fi
colorize() {
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
{ echo
colorize 1 "WARNING"
echo ": Can not proceed with installation. Kindly remove the '${PYENV_ROOT}' directory first."
echo
} >&2
exit 1
fi
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"
}
if ! command -v git 1>/dev/null 2>&1; then
echo "pyenv: Git is not installed, can't continue." >&2
exit 1
fi
# Check ssh authentication if USE_SSH is present
if [ -n "${USE_SSH}" ]; then
if ! command -v ssh 1>/dev/null 2>&1; then
echo "pyenv: configuration USE_SSH found but ssh is not installed, can't continue." >&2
exit 1
fi
# `ssh -T git@github.com' returns 1 on success
# See https://docs.github.com/en/authentication/connecting-to-github-with-ssh/testing-your-ssh-connection
ssh -T git@github.com 1>/dev/null 2>&1 || EXIT_CODE=$?
if [[ ${EXIT_CODE} != 1 ]]; then
echo "pyenv: github ssh authentication failed."
echo
echo "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:"
echo
echo "> https://docs.github.com/en/repositories/creating-and-managing-repositories/troubleshooting-cloning-errors#check-your-ssh-access"
echo
echo "Once you have an ssh key set up, try running the command again."
exit 1
fi
fi
if [ -n "${USE_SSH}" ]; then
GITHUB="git@github.com:"
else
GITHUB="https://github.com/"
fi
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"
if ! command -v pyenv 1>/dev/null; then
{ echo
colorize 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" ]; then if [ -z "$HOME" ]; then printf "$0: %s\n" \ "Either \$PYENV_ROOT or \$HOME must be set to determine the install location." \ >&2 exit 1 fi export 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 { echo colorize 1 "WARNING" echo ": Can not proceed with installation. Kindly remove the '${PYENV_ROOT}' directory first." echo } >&2 exit 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; then echo "pyenv: Git is not installed, can't continue." >&2 exit 1 fi
- 如果系统没有安装
git
,脚本会输出错误并退出。
- 如果系统没有安装
-
检查
USE_SSH
配置if [ -n "${USE_SSH}" ]; then if ! command -v ssh 1>/dev/null 2>&1; then echo "pyenv: configuration USE_SSH found but ssh is not installed, can't continue." >&2 exit 1 fi # `ssh -T git@github.com' returns 1 on success ssh -T git@github.com 1>/dev/null 2>&1 || EXIT_CODE=$? if [[ ${EXIT_CODE} != 1 ]]; then echo "pyenv: github ssh authentication failed." exit 1 fi fi
- 如果环境变量
USE_SSH
设置了,脚本会检查系统是否安装了ssh
,如果没有安装,退出。 - 然后,使用
ssh
测试 GitHub 的 SSH 连接,确保 SSH 密钥设置正确。
- 如果环境变量
-
设置 GitHub 地址(基于是否使用 SSH)
if [ -n "${USE_SSH}" ]; then GITHUB="git@github.com:" else GITHUB="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 { echo colorize 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
安装到指定的目录,从而避免日积月累各种依赖包塞满系统盘。
原文地址:https://blog.csdn.net/uwoerla/article/details/144285269
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!