python版本控制-pyenv

前言

日常开发中,我喜欢开发环境比实际运行环境高一个版本。因为这似乎有助于,让程序不断适应高版本的运行环境。

但是,今天遇到一个例外 — python。我系统默认的python版本是3.9,但是CI上的版本是3.6。众所周知,pyhton是不考虑向前兼容的。这导致我本地运行正常的代码,无法在CI上通过。

所以,我需要在本地切换python版本。

本次尝试使用 pyenv 对linux系统中的pyhton版本和虚拟环境进行管理。


pyenv的安装与简单使用

参考自:

  • pyenv/pyenv: Simple Python version management
  • Python多环境管理神器(pyenv) - doublexi - 博客园
# ref: https://github.com/pyenv/pyenv-installer# 当前用户安装pyenv
curl https://pyenv.run | bash# 如果正在使用的是bash的话,添加下面内容到~/.bashrc
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"# 列出可安装的python版本
pyenv install --list# 因为不同版本的python是在本地编译的,建议准备好环境
# ref: https://github.com/pyenv/pyenv/wiki#suggested-build-environment# 安装指定版本,比如3.6.8
## 下面的命令会报错
pyenv install 3.6.8Installing Python-3.6.8...
/root/.pyenv/plugins/python-build/bin/python-build: line 1851: 409967 Segmentation fault      (core dumped) "$PYTHON_BIN" -c "import $1"
WARNING: The Python ctypes extension was not compiled. Missing the libffi lib?
/root/.pyenv/plugins/python-build/bin/python-build: line 2072: 409974 Segmentation fault      (core dumped) "$PYTHON_BIN" $python_opts -m ensurepip ${ensurepip_opts} > /dev/null 2>&1
Installing pip from https://bootstrap.pypa.io/pip/3.6/get-pip.py...
/root/.pyenv/plugins/python-build/bin/python-build: line 2048: 409998 Segmentation fault      (core dumped) "${PYTHON_BIN}" -s "${get_pip}" ${GET_PIP_OPTS} 1>&4 2>&1
error: failed to install pip via get-pip.pyBUILD FAILED (AlmaLinux 9.3 using python-build 20180424)# ref:https://github.com/pyenv/pyenv/issues/2141
# 下面这样就没有问题了
CC=clang pyenv install 3.6.8# almaliux9上直接安装3.7版本是可以的
pyenv install  3.7# 查看当前已经安装的python版本
pyenv versions
* system (set by /root/.pyenv/version)3.7.17# 切换当前shell的python版本
pyenv shell 3.7.17
python --version
Python 3.7.17# 退出当前pyhotn版本,返回系统的python版本
pyenv shell --unset# 如果还需要在不同版本下,创建虚拟环境
pyenv help virtualenv
pyenv virtualenv 3.3.3 myproj3 # 创建虚拟环境
pyenv activate myproj3 # 激活虚拟环境
pyenv deactivate # 退出虚拟环境
pyenv uninstall myproj3 #删除虚拟环境

尝试修改安装路径-失败

上面使用脚本安装 pyenv 有一个缺点,默认安装在家目录。安装在家目录有个缺点是,不同用户之间不好共享这个程序。

所以我们将其安装到 /opt 目录下。下面的修改方法,对于当前的安装脚本有效。注意安装前,翻看下安装脚本。

参考:python - How to use pyenv with another user? - Stack Overflow

# root用户
# mkdir -p /opt/pyenv
# rm -rf /opt/pyenv# 指定安装位置
export PYENV_ROOT=/opt/pyenvcurl https://pyenv.run | bash# 如果正在使用的是bash的话,添加下面内容到~/.bashrc
export PYENV_ROOT=/opt/pyenv
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"# 安装一个版本
CC=clang pyenv install 3.6.8# 切换到普通用户,如上修改~/.bashrc后,
# pyenv会提示
pyenv: cannot rehash: /opt/pyenv/shims isn't writable# 能不能让shims,对于不同用户放在不同目录呢?# 不同用户使用pyenv,还是各用各的吧。都安装下,也不麻烦

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

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

相关文章

TikTok需要的原生IP是什么?海外独享原生IP地址如何获取?

相信很多做跨境店铺或者TikTok直播的小伙伴都听说过”原生IP”,网络上关于它的判定方法也五花八门,今天小编以自身跨境经验来为大家介绍原生IP是什么?有什么好处?如何获取,感兴趣请继续看下去! 一、什么是原生IP/非原生IP? 原生…

OpenCV-16图像的基本变换

一、图像的放大与缩小 1. 对小狗图片进行缩放 使用API----resize(src, dsize, [,dst,[fx[,fy[,interpolation]]]]) src:要缩放的图像。 dsize:缩放之后的图像大小,元组和列表表示都可以。 dst:可选参数…

Jmeter 性能 —— 电商系统TPS计算

1、怎么计算得出TPS指标 ①第一个通过运维那边给的生产数据,看一下生产进件有多少,计算得来的,如果没有生产数据,或者不过就看如下的方法 ②第二个就是根据最近一个月的实际访问数据,比如每天调用了多少个接口&#…

src refspec master does not match any

新项目推送至 Git 空仓库时抛出如下异常 src refspec master does not match any 初始化 init 都做了但反复尝试 git push -u origin master 均无果 后发现权限不够 .... 起初设置为开发者,后变更为了主程序员再次尝试 push 成功 .... 以上便是此次分享的全部内容,…

支持 input 函数的在线 python 运行环境 - 基于队列

支持 input 函数的在线 python 运行环境 - 基于队列 思路两次用户输入三次用户输入 实现前端使用 vue element uiWindows 环境的执行器子进程需要执行的代码 代码仓库参考 本文提供了一种方式来实现支持 input 函数,即支持用户输的在线 python 运行环境。效果如下图…

什么是谐波减速机?日本Harmonic哈默纳科谐波减速机有哪些优点?

一、什么是谐波减速机? 谐波减速装置最早期被叫做“strain wave gearing”,直译过来为“应变波齿轮”。其后被HarmonicDrive Systems 公司大规模商业实用化后,经过二次翻译后,中文名称才将其称为“谐波齿轮传动”。 谐波减速机是…

Kubernetes(K8s)命令大全

Kubernetes(简称K8s)是一种开源的容器编排平台,用于自动化应用程序的部署、扩展和管理。通过Kubernetes,您可以轻松地管理容器化应用,实现高可用性、弹性伸缩以及简化的部署和维护。以下是一份Kubernetes常用命令的大全…

数据结构第六弹---带头双向循环链表

双向循环链表 1、带头双向循环链表概念2、带头双向循环链表的优势3、带头双向循环链表的实现3.1、头文件包含和结构定义3.2、创建新结点3.3、打印3.4、初始化3.5、销毁3.6、尾插3.7、头插3.8、头删3.9、尾删3.10、查找3.11、在pos之前插入3.12、删除pos位置3.13、判断是否为空3…

云原生战专题 | 深入浅出分析云原生微服务的技术结构和架构设计

深入浅出分析云原生微服务的技术结构和架构设计 云原生容器技术背景容器编排Kubernetes控制平面的四大组件Kubernetes在容器编排中的设计要点 云原生微服务典型架构第一代微服务架构第二代微服务架构第三代微服务架构第四代微服务架构 未来的云原生架构 — Serverless 云原生容…

springboot + vue3实现增删改查分页操作

springboot vue3实现增删改查分页操作 环境最终实现效果实现功能主要框架代码实现数据库后端前端 注意事项 环境 jdk17 vue3 最终实现效果 实现功能 添加用户,禁用,启用,删除,编辑,分页查询 主要框架 后端 spri…

AJAX(三)跨域

一、同源策略 同源策略最早由Netscape公司提出,是浏览器的一种安全策略。 同源:协议、域名、端口号必须完全相同。(同一个来源) 违背同源策略就是跨域。 AJAX发送请求时是默认要遵循同源策略的,不是同源策略&#…

pytorch08:学习率调整策略

目录 一、为什么要调整学习率?1.1 class _LRScheduler 二、pytorch的六种学习率调整策略2.1 StepLR2.2 MultiStepLR2.3 ExponentialLR2.4 CosineAnnealingLR2.5 ReduceLRonPlateau2.6 LambdaLR 三、学习率调整小结四、学习率初始化 一、为什么要调整学习率&#xff…

Leetcode2965. 找出缺失和重复的数字

Every day a Leetcode 题目来源:2965. 找出缺失和重复的数字 解法1:哈希 用哈希表统计数组 grid 中各元素的出现次数,其中出现次数为 2 的记为 a。 统计数组 grid 的元素之和为 sum。 数组 grid 其中的值在 [1, n2] 范围内,…

【AWS系列】巧用 G5g 畅游Android流媒体游戏

序言 Amazon EC2 G5g 实例由 AWS Graviton2 处理器提供支持,并配备 NVIDIA T4G Tensor Core GPU,可为 Android 游戏流媒体等图形工作负载提供 Amazon EC2 中最佳的性价比。它们是第一个具有 GPU 加速功能的基于 Arm 的实例。 借助 G5g 实例,游…

06.JAVA常用类方法(StringBuilder与StringBuffer、Arrays与Array比较和常用方法+代码示例)

StringBuilder 基本介绍 概述:可变的字符串类,可视为一个容器,StringBuilder对象中的内容是可变的,也可称之为字符串缓冲类。其常用的成员方法根据有无返回值可以分为查询和删改两大类。 构造方法:StringBuilder( …

阻止持久性攻击改善网络安全

MITRE ATT&CK框架是一个全球可访问的精选知识数据库,其中包含基于真实世界观察的已知网络攻击技术和策略。持久性是攻击者用来访问系统的众多网络攻击技术之一;在获得初始访问权限后,他们继续在很长一段时间内保持立足点,以窃取数据、修改…

Java实战项目六:进销存管理系统

文章目录 一、系统概述二、关键知识点梳理(一)数据库设计与连接(二)实体类与关系映射(三)集合框架的应用(四)CRUD操作与事务管理 三、系统架构与模块划分(一)…

集合-及其各种特征详解

集合 概念:是提供一种存储空间 可变 的存储模型,存储的数据容量可以发生改变。(也就是集合容量不固定) 集合关系图 绿色的代表接口,蓝色的代表接口的实现类 单列集合 Collection(接口) 概述:单列集合的…

spring模块(一)DI依赖注入

一、介绍:Dependency Injection,组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为…

【策】策略

为应对未来激烈的竞争,需要具备以下要素: 主动选择。每个人都有主动选择的权利,既然做出选择,应对其产生的结果而负责。反逆向思维。梳理过程,分析因果,优化决策。