自学内容网 自学内容网

pyenv 安装脚本解读

在这里插入图片描述

pyenv 安装脚本

curl https://pyenv.run | bash

执行上面这一行脚本就可以安装pyenv来满足你对 Python 多版本共存以及切换的支持。

pyenv搭配virtualenv可以满足你对Python虚拟环境版本的支持。个人感觉pyenvconda更轻量,更推荐使用。

那么上面的脚本到底干了什么事儿呢?

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 和它的一些插件,并设置适当的路径和权限。

  1. 设置脚本行为和调试信息

    set -e
    [ -n "$PYENV_DEBUG" ] && set -x
    
    • set -e:如果脚本中某一行命令返回非零值(即出错),则立即退出脚本。
    • set -x:如果环境变量 PYENV_DEBUG 被设置,则开启调试模式,打印每个执行的命令。
  2. 设置 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
  3. 颜色化输出函数

    colorize() {
      if [ -t 1 ]; then printf "\e[%sm%s\e[m" "$1" "$2"
      else echo -n "$2"
      fi
    }
    
    • colorize 函数用于输出带有颜色的文本,支持终端支持颜色时输出颜色,不支持时输出普通文本。
  4. 检查 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 目录已存在,脚本会输出警告并退出,要求用户先删除该目录才能继续安装。
  5. 定义 failed_checkoutcheckout 函数

    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)。
  6. 检查是否安装 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,脚本会输出错误并退出。
  7. 检查 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 密钥设置正确。
  8. 设置 GitHub 地址(基于是否使用 SSH)

    if [ -n "${USE_SSH}" ]; then
      GITHUB="git@github.com:"
    else
      GITHUB="https://github.com/"
    fi
    
    • 如果使用 SSH,设置 GitHub 地址为 git@github.com:,否则使用 HTTPS。
  9. 克隆 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-doctorpyenv-updatepyenv-virtualenv
  10. 提醒用户配置 pyenv 到 PATH

    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
    
    • 如果 pyenv 没有被正确添加到 PATH,脚本会提醒用户,并尝试运行 pyenv initpyenv virtualenv-init 来显示如何配置。

总结

这个脚本的作用是为用户自动安装 pyenv 和相关插件。它会确保环境符合安装要求,检查 git 是否可用,确认用户是否有正确的 SSH 配置,并从 GitHub 克隆 pyenv 和其插件。然后它会提醒用户如何正确配置 pyenv,以便在系统中使用它。如果某些条件不满足,脚本会提前退出并给出相应的错误提示。

我们可以通过export PYENV_ROOT="/data/pyenv"设置PYENV_ROOTpyenv安装到指定的目录,从而避免日积月累各种依赖包塞满系统盘。


原文地址:https://blog.csdn.net/uwoerla/article/details/144285269

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!