pyenv 安装脚本解读

news2025/1/6 20:15:18

在这里插入图片描述

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安装到指定的目录,从而避免日积月累各种依赖包塞满系统盘。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2257352.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenAI 12Days 第二天 强化微调(RFT):推动语言模型在科学研究中的应用

OpenAI 12Days 第二天 强化微调(RFT):推动语言模型在科学研究中的应用 文章目录 OpenAI 12Days 第二天 强化微调(RFT):推动语言模型在科学研究中的应用RFT的工作原理与应用领域案例研究:基因突变…

柯桥职场商务英语生活英语口语培训外贸纺织口语学习

"等一下"该怎么说? 大家应该都知道,wait a moment是一个祈使句,祈使句就难免带有命令的口吻,还有点不耐烦。 如果你把“等一下”说成wait a moment,外国人多半认为你是个傲慢无礼的人。毕竟在他们看来wait a…

嵌入式蓝桥杯学习7 产生PWM

Cubemx配置 打开cubemx,前面的配置看上文,这里主要配置定时器产生PWM波。 以PA1的TIM2-CH2通道为例进行演示。 1.在Timers中打开TIM2,将Channel2配置为PWM Generation CH2。 2.将Clock Source 选择为Internal Clock。 3.配置Paramater Settings中的参…

SQL Server中SELECT (Transact-SQL)语法定义和解释

语法定义&#xff1a; <SELECT statement> ::[ WITH { [ XMLNAMESPACES , ] [ <common_table_expression> [ , ...n ] ] } ]<query_expression>[ ORDER BY <order_by_expression> ][ <FOR Clause> ][ OPTION ( <query_hint> [ , ...n ] )…

证书监控续签工具

详细实现方式以及代码下载请前往https://www.passerma.com/article/91 一个基于 go 的 ssl 证书监控续签工具&#xff0c;用于监控阿里云免费 ssl 证书的有效期&#xff0c;并在证书即将过期时自动续签证书 仅支持续签阿里云的免费证书 页面 使用方法 1.申请阿里云账号 2.…

【开源】A063—基于Spring Boot的农产品直卖平台的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看项目链接获取⬇️&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600个选题ex…

HDR视频技术之六:色调映射

图像显示技术的最终目的就是使得显示的图像效果尽量接近人们在自然界中观察到的对应的场景。 HDR 图像与视频有着更高的亮度、更深的位深、更广的色域&#xff0c;因此它无法在常见的普通显示器上显示。 入门级的显示器与播放设备&#xff08;例如普通人家使用的电视&#xff0…

【C++笔记】map和set的使用

前言 各位读者朋友们大家好&#xff01;上期我们讲完了二叉搜索树这一数据结构&#xff0c;这一期我们来讲STL中的map和set这两大容器。这两个容器的底层是红黑树&#xff0c;红黑树的底层是平衡二叉搜索树。 目录 前言一. 序列式容器和关联式容器二. set系列的使用2.1 set类…

DevOps持续集成

DevOps流程 第一步安装git 关闭防火墙 systemctl stop firewalld cd /usr/loacl vim docker-compose.yml docker search gitlab 拉取gitlab镜像 2.33GB docker pull gitlab/gitlab-ce:latestvim docker-compose.yml修改docker-compose.yml version: 3.1 services:gitlab:i…

TCP的“可靠性”(上)

目录 TCP的“可靠性”&#xff08;上&#xff09;确认应答&#xff08;可靠性传输的基础&#xff09;超时重传连接管理&#xff08;三次握手&#xff0c;四次挥手&#xff09; TCP的“可靠性”&#xff08;上&#xff09; 想必大家都或多或少的听说过TCP的特性&#xff1a;有连…

【C++】求第二大的数详细解析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;输入描述&#x1f4af;解题思路分析1. 题目核心要求2. 代码实现与解析3. 核心逻辑逐步解析定义并初始化变量遍历并处理输入数据更新最大值与次大值输…

Linux图形化工具推荐

1、MobaXterm MobaXterm Xserver with SSH, telnet, RDP, VNC and X11 - DownloadFree X server for Windows with tabbed SSH terminal, telnet, RDP, VNC and X11-forwarding - Downloadhttps://mobaxterm.mobatek.net/download.html 2、FinalShell FinalShell SSH工具,服…

SQL计算字段:拼接字段

为了说明如何使用计算字段&#xff0c;本文将通过一个简单的示例来展示如何将两列组合成一个标题。假设Vendors表包含供应商的名称和国家信息&#xff0c;我们希望生成一个报表&#xff0c;其中列出每个供应商的名称和所在国家&#xff0c;并且需要格式化名称显示&#xff0c;国…

【Spring项目】表白墙,留言板项目的实现

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;项目实现准备 1&#xff1a;需求 2&#xff1a;准备工作 &#xff08;1&#xff09;…

MySQL | 尚硅谷 | 第12章_MySQL数据类型精讲

MySQL笔记&#xff1a;第12章_MySQL数据类型精讲 文章目录 MySQL笔记&#xff1a;第12章_MySQL数据类型精讲第12章_MySQL数据类型精讲 1. MySQL中的数据类型2. 整数类型2.1 类型介绍2.2 可选属性2.2.1 M2.2.2 UNSIGNED2.2.3 ZEROFILL 2.3 适用场景2.4 如何选择&#xff1f;演示…

ElasticSearch常见面试题汇总

一、ElasticSearch基础&#xff1a; 1、什么是Elasticsearch&#xff1a; Elasticsearch 是基于 Lucene 的 Restful 的分布式实时全文搜索引擎&#xff0c;每个字段都被索引并可被搜索&#xff0c;可以快速存储、搜索、分析海量的数据。 全文检索是指对每一个词建立一个索引…

40分钟学 Go 语言高并发:负载均衡与服务治理

负载均衡与服务治理 一、知识要点总览 模块核心内容技术实现难度负载策略轮询、权重、最小连接数自定义负载均衡器中服务降级服务降级、熔断降级、限流降级Hystrix模式高熔断机制熔断器状态机、失败计数、自动恢复Circuit Breaker高限流设计令牌桶、滑动窗口、计数器Rate Lim…

克服大规模语言模型限制,构建新的应用方法——LangChain

大模型 大模型的出现和落地开启了人工智能(AI)新一轮的信息技术革命&#xff0c;改变了人们的生 活方式、工作方式和思维方式。大模型的落地需要数据、算力和算法三大要素。经过几 年发展&#xff0c;大模型的数据集(包括多模态数据集)制作已经形成了规约&#xff0c;Meta、Go…

LLM - 多模态大模型的开源评估工具 VLMEvalKit 部署与测试 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/144353087 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 VLMEva…

jenkins邮件的配置详解

Jenkins邮件的配置涉及多个步骤和细节,以下是详细的配置指南: 一、前期准备 确定邮件服务:明确Jenkins将要使用的邮件服务,如QQ邮箱、163邮箱、公司邮箱(基于Microsoft 365或Exchange Server)等。获取SMTP配置信息:根据邮件服务类型,获取相应的SMTP服务器地址、端口号…