Mac中pyenv的安装与使用教程

 更新时间:2022年02月14日 15:38:10   作者:LinXunFeng  
pyenv支持linux下python多版本的共存和版本之间切换,非常方便,下面这篇文章主要给大家介绍了关于Mac中pyenv安装与使用的相关资料,需要的朋友可以参考下

前言

pyenv 可在不同 python 版本之间轻松切换,实现 python 环境隔离,且支持自动激活和退出虚拟环境

一、pyenv

1、安装

方式一:Git Clone

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

bash

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/shims:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
exec $SHELL -l

zsh

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/shims:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
exec $SHELL -l

方式二:Homebrew

安装

brew install pyenv

根据自身环境,将下方内容加到对应文件中: .bashrc / .zshrc

export PYENV_ROOT=/usr/local/var/pyenv
export PATH="$PYENV_ROOT/bin:$PATH"
export PATH="$PYENV_ROOT/shims:$PATH"
if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi

2、验证

验证安装是否成功:

pyenv

3、使用

基本使用

命令描述
pyenv --version查看 pyenv 的版本
pyenv versions罗列当前已安装的所有 python 环境,如果是当前正在使用的环境,则前面会有个 *
pyenv help查看帮助
pyenv init如果输入 pyenv 之后使用 tab 不补全,可以使用该命令进行初始即可使用补全命令

安装环境

命令描述
pyenv install -l显示可以安装的版本列表
pyenv install 版本号安装指定版本的 python
pyenv rehash更新本地数据库,安装指定版本的 python 后使用

环境应用

命令描述
pyenv global 版本号更改本机版本,重启不会造成再次更改
pyenv local 版本号会在当前目录创建 .python-version 文件,并记录设置的 python 环境,每次进入该目录会自动设置成该 python 环境
pyenv shell 版本号更改当前 shell 下使用的 python 版本,临时生效,优先级高于 global

二、virtualenv插件

1、安装

方式一:Git Clone

cd .pyenv/plugins
git clone https://github.com/pyenv/pyenv-virtualenv.git # 安装virtualenv插件

方式二:Homebrew

brew install pyenv-virtualenv

2、配置

无论使用上述的哪种方式进行的安装,请根据自身环境,将下方内容加到对应文件中: .bashrc / .zshrc

eval "$(pyenv virtualenv-init -)"

3、使用

基本使用

命令描述
pyenv virtualenv 3.8.3 env383创建 3.8.3 版本虚拟环境
pyenv virtualenvs显示环境
pyenv activate env383激活使用指定的虚拟环境
pyenv deactivate退出当前虚拟环境
rm -rf .pyenv/versions/3.8.3删除版本环境
rm -rf .pyenv/versions/env383删除虚拟环境

自动激活和退出虚拟环境

在需要使用虚拟环境的目录(通常是项目目录)中:

  • 建立一个 .python-version 的文本文件
  • 将虚拟环境名称(如 env383 )写在里面

之后每次进/出该目录时,虚拟环境都将自动激活/退出。

三、报错

1、激活指定的虚拟环境时报错

# 命令
pyenv activate env383

# 报错信息
Failed to activate virtualenv.

Perhaps pyenv-virtualenv has not been loaded into your shell properly.
Please restart current shell and try again.

别慌,重启你的终端,或者执行如下命令即可

exec $SHELL -l

2、还是系统版本

如果你用 pyenv versions 查看,明明已经切换成功,但是用 python -V却还是系统版本。

原因是 pyenv没有加到 $PATH环境变量里去,解决办法如下:

export PYENV_ROOT=~/.pyenv
export PATH=$PYENV_ROOT/shims:$PATH

3、安装 python报错

安装 python报错,如

pyenv install 3.8.3

报错内容:

python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.8.3.tar.xz...
-> https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tar.xz
Installing Python-3.8.3...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk

BUILD FAILED (OS X 12.0.1 using python-build 20180424)

Inspect or clean up the working tree at /var/folders/cy/8zkx5hys2tsgb1d_x42_r8qc0000gn/T/python-build.20220122174148.1531
Results logged to /var/folders/cy/8zkx5hys2tsgb1d_x42_r8qc0000gn/T/python-build.20220122174148.1531.log

Last 10 log lines:
clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include   -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include   -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration  -I./Include/internal  -I. -I./Include -I/usr/local/opt/readline/include -I/usr/local/opt/readline/include -I/usr/local/var/pyenv/versions/3.8.3/include -I/usr/local/opt/sqlite/include -I/usr/local/opt/readline/include -I/usr/local/opt/readline/include -I/usr/local/var/pyenv/versions/3.8.3/include -I/usr/local/opt/sqlite/include  -DPy_BUILD_CORE_BUILTIN  -c ./Modules/_codecsmodule.c -o Modules/_codecsmodule.o
clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include   -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include   -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration  -I./Include/internal  -I. -I./Include -I/usr/local/opt/readline/include -I/usr/local/opt/readline/include -I/usr/local/var/pyenv/versions/3.8.3/include -I/usr/local/opt/sqlite/include -I/usr/local/opt/readline/include -I/usr/local/opt/readline/include -I/usr/local/var/pyenv/versions/3.8.3/include -I/usr/local/opt/sqlite/include  -DPy_BUILD_CORE_BUILTIN  -c ./Modules/_weakref.c -o Modules/_weakref.o
./Modules/posixmodule.c:9221:15: error: implicit declaration of function 'sendfile' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
        ret = sendfile(in, out, offset, &sbytes, &sf, flags);
              ^
clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include   -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include   -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration  -I./Include/internal  -I. -I./Include -I/usr/local/opt/readline/include -I/usr/local/opt/readline/include -I/usr/local/var/pyenv/versions/3.8.3/include -I/usr/local/opt/sqlite/include -I/usr/local/opt/readline/include -I/usr/local/opt/readline/include -I/usr/local/var/pyenv/versions/3.8.3/include -I/usr/local/opt/sqlite/include  -DPy_BUILD_CORE_BUILTIN  -DPy_BUILD_CORE_BUILTIN -I./Include/internal -c ./Modules/_functoolsmodule.c -o Modules/_functoolsmodule.o
1 error generated.
make: *** [Modules/posixmodule.o] Error 1
make: *** Waiting for unfinished jobs....
1 warning generated.

使用下面的命令安装即可,注意修改成相应的版本号

CFLAGS="-I$(brew --prefix openssl)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix readline)/include -I$(xcrun --show-sdk-path)/usr/include" LDFLAGS="-L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install --patch 3.8.3 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)

四、注意

  • 安装好的版本不做任何修改,我们只操作虚拟环境,如 env383
  • 可以通过版本来多个虚拟环境,如 env383_1、env383_2
  • 导出当前环境的依赖库: pip freeze > requirements.txt
  • 导入依赖库到当前环境: pip install -r requirements.txt

五、相关知识

5.1、pyenv能做什么

1,基于每个用户更改全局Python版本

2,对每个项目的Python版本提供支持

3,允许通过环境变量覆盖Python版本

4,一次搜索多个版本的Python

5.2、pyenv运行

在一个高的级别上,pyenv使用shim可执行文件注入到PATH来拦截Python命令;确定您的应用程序指定了哪个Python版本,并将命令传递给正确的已安装Python版本。

5.3、PATH

当运行诸如python或pip等命令时,操作系统将在目录列表中搜索以查找具有该名称的可执行文件。此目录列表位于一个名为PATH的环境变量中,列表中的每个目录都用冒号分隔:

/usr/local/bin:/usr/bin:/bin

PATH从左到右搜索目录,因此列表开头目录中的匹配可执行文件优先于结尾目录中的另一个可执行文件。在这个例子中, /usr/local/bin目录将被搜索的第一个,然后是/usr/bin,然后是/bin。

5.4、shims

pyenv通过在你的PATH前插入shims目录来工作:

$(pyenv root)/shims:/usr/local/bin:/usr/bin:/bin

Shim是轻量级的可执行文件,它们只是将命令传递给pyenv。因此在安装了pyenv的情况下,运行pip时操作系统将执行以下操作:

1,在PATH中搜索名称为pip的可执行文件

2,在PATH开头的shims目录中,找到名称为pip的shim文件

3,运行名称为pip的shime文件,shime将命令传递给pyenv

总结

到此这篇关于Mac中pyenv的安装与使用的文章就介绍到这了,更多相关Mac pyenv安装使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用python调用llama3进行对话的操作步骤

    使用python调用llama3进行对话的操作步骤

    Meta 已将最新的 LLaMa3 进行了开源,因此,我们也可以方便的使用 Python 进行 LLaMa3 模型的调用和开发,本文给大家介绍了如何使用 python 调用 llama3 进行对话,需要的朋友可以参考下
    2024-09-09
  • Python解析m3u8拼接下载mp4视频文件的示例代码

    Python解析m3u8拼接下载mp4视频文件的示例代码

    这篇文章主要介绍了Python解析m3u8拼接下载mp4视频文件的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Python实现用networkx绘制MultiDiGraph

    Python实现用networkx绘制MultiDiGraph

    这篇文章主要介绍了Python实现用networkx绘制MultiDiGraph方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Python比较两个日期的两种方法详解

    Python比较两个日期的两种方法详解

    我们使用Python处理日期/时间的时候,经常会遇到各种各样的问题。本文为大家总结了两个Python比较两个日期的方法,需要的可以参考一下
    2022-07-07
  • 探究Python的Tornado框架对子域名和泛域名的支持

    探究Python的Tornado框架对子域名和泛域名的支持

    这篇文章主要介绍了探究Python的Tornado框架对子域名和泛域名的支持,Tornado作为一个典型的异步框架、在Python开发者中的人气相当高,需要的朋友可以参考下
    2015-05-05
  • Python下的Mysql模块MySQLdb安装详解

    Python下的Mysql模块MySQLdb安装详解

    在Python环境下,如果想操作MySQL数据库,难免会调用相应的包,比如常用的:MySQLdb通过导入:import MySQLdb 后,可直接调用里面的方法
    2014-04-04
  • 如何通过python实现全排列

    如何通过python实现全排列

    这篇文章主要介绍了如何通过python实现全排列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Python+redis通过限流保护高并发系统

    Python+redis通过限流保护高并发系统

    这篇文章主要介绍了Python+redis通过限流保护高并发系统,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 如何从csv文件构建Tensorflow的数据集

    如何从csv文件构建Tensorflow的数据集

    这篇文章主要介绍了如何从csv文件构建Tensorflow的数据集,帮助大家更好的理解和使用Tensorflow,感兴趣的朋友可以了解下
    2020-09-09
  • 十行Python代码制作一个视频倒放神器

    十行Python代码制作一个视频倒放神器

    这篇文章主要介绍了如何通过十行代码实现视频倒放神器,轻松实现视频倒放功能。文中的示例代码简洁易懂,对我们学习Python有一定帮助,需要的可以参考一下
    2022-02-02

最新评论