Python多环境管理——pyenv

Stella981
• 阅读 713

1 背景&概述

因某些需求,需要安装TensorFlow,很自然地在终端敲下了以下命令:

pip install tensorflow

然后。。。

Python多环境管理——pyenv

好家伙???

居然没有??

因为是Python 3.9,去pypi搜索了,居然还真没有支持的,最高只有Python 3.8

Python多环境管理——pyenv

于是便考虑一个多版本的Python环境,碰巧就在Github上看到了一个22.3k的东西:

Python多环境管理——pyenv

这就是pyenv,一个简单的Python版本管理器,可以轻松地在各个Python版本之间进行切换。

好了废话不说,进入正题。

2 安装

安装有两种方式:

  • 自动安装
  • 手动安装

2.1 自动安装

curl https://pyenv.run | bash
# 或
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash

2.2 手动安装

手动安装大致分为三步:

  • 安装pyenv
  • 配置环境变量
  • 初始化

2.2.1 安装pyenv

笔者系统Manjaro,可以直接yay安装:

yay -S pyenv

其他系统的可以使用apt search/yum search等看看软件包仓库有没有,有的话直接安装即可,没有的话,可以clone安装:

git clone https://github.com/pyenv/pyenv.git ~/.pyenv

这一步是可选的)接着就是编译动态bash扩展进行加速:

cd ~/.pyenv && src/configure && make -C src

官方解释说,不用害怕编译失败,因为仍然会正常工作。

2.2.2 配置环境变量

这一步就是把PYENV以及更新后的PATH配置成环境变量,官方文档按照shell类型进行了分类,根据自己情况选择即可。

2.2.2.1 bash

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile

2.2.2.2 Zsh

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc

2.2.2.3 Fish shell

set -Ux PYENV_ROOT $HOME/.pyenv
set -Ux fish_user_paths $PYENV_ROOT/bin $fish_user_paths

2.2.3 初始化

配置完环境变量后还要进行初始化操作,文档同样按shell类型进行了分类。

2.2.3.1 bash

echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile

2.2.3.2 Zsh

echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.zshrc

2.2.3.3 Fish shell

echo -e '\n\n# pyenv init\nif command -v pyenv 1>/dev/null 2>&1\n  pyenv init - | source\nend' >> ~/.config/fish/config.fish

2.3 测试

重新开启一个终端,输入pyenv,输出如下信息就表明安装成功了:

Python多环境管理——pyenv

3 基本使用

  • pyenv commands:查看所有pyenv命令
  • pyenv exec:使用特定Python版本执行某条命令
  • pyenv global:设置或查看全局Python版本
  • pyenv hooks:列出给出的pyenv命令的钩子脚本
  • pyenv init:配置shell环境
  • pyenv install:安装某个版本的Python
  • pyenv local:为某个应用设置特定的Python版本
  • pyenv prefix:显示对应Python版本的路径前缀
  • pyenv rehash:再哈希pyenv shims(不清楚有什么用,欢迎评论补充)
  • pyenv root:显示pyenv根目录
  • pyenv shell:为某个shell设置特定的Python版本(与pyenv local类似)
  • pyenv shims:列出当前存在的shimspyenv的工作原理就是在一个叫shims的目录下创建Python解释器的“假版本”,寻找Python应用时先从该目录查找)
  • pyenv uninstall:卸载某个版本Python
  • pyenv --version:显示pyenv版本
  • pyenv version:显示当前Python版本,等价于pyenv version-name+pyenv version-file
  • pyenv version-file/version-name/version-origin:当前Python版本对应的文件/名字/位置
  • pyenv whence:列出已安装的一个范围内的Python版本,比如列出本地安装的Python2Python3的版本,可以使用pyenv whence 2to3
  • pyenv which:列出可执行文件的绝对路径,比如pyenv which python可以列出python命令的绝对路径

4 实际应用

虽然上面说了这么多命令,但实际使用频率高的命令并不多,主要有以下几个:

  • pyenv version
  • pyenv install
  • pyenv global

一般安装的步骤如下,先使用

pyenv install -l

查找需要安装的Python版本:

Python多环境管理——pyenv

这里还有一大串,就不全部截图了,比如需要安装3.6.12版本:

pyenv install 3.6.12

安装之后可以使用

pyenv versions

查看安装的版本,这里笔者安装有两个,一个是系统自带的Python3.9,一个是pyenv安装的Python3.6

Python多环境管理——pyenv

接着使用

pyenv global 3.6.12

切换到新安装的版本:

Python多环境管理——pyenv

这样就切换到了新安装的版本,如果不是全局替换而是局部替换的话可以使用pyenv local/pyenv shell

要注意的是切换版本后pip的版本也会不一样,而且两个版本使用pip安装的包也是独立的:

Python多环境管理——pyenv

Python多环境管理——pyenv

5 参考

1、Github-pyenv

2、Github-pyenv-installer

3、知乎-Python环境Memo

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这