从 JavaScript 角度学 Python(17) - Python 版本管理与虚拟环境

前言

那麽前面我们聊了 pip 的基本指令与操作,但是在前一章节有一些问题存在,可是我并没有介绍到如何解决,所以这一篇就会来介绍如何解决。

虚拟环境

前面章节我们介绍了 pip 的指令与安装,但是我们有发现一件事情,就是关於安装套件的部分。

嗯?什麽?你忘了?没事,我这边在介绍一次...

https://ithelp.ithome.com.tw/upload/images/20210917/20119486fvTu3mh5MK.png

(上面开玩笑的。)

前一章节我们知道不论安装什麽套件的会被安装在 Global 环境:

pip3 install pytube

那麽这时候套件一多不但麻烦又有可能影响自己的开发环境,毕竟有些时候我们在开发时只会用特定版本的套件,但是用 pip3 install 安装指令的话就会变成一直覆盖再覆盖自己 Global 环境的问题发生,因此在官方文件中就有一个章节是「虚拟环境与套件」,而这个章节就是在解决这个问题。

建立虚拟环境

那麽在 Python 3.3 的时候,内建了一个模组叫做 venv,而满多文章我查了一下大约在 Python 3.5 就成为管理虚拟环境的推荐工具,因此我们可以透过这个模组直接生成一个虚拟环境。

那麽这个 venv 主要用途是什麽呢?简单来讲他可以依据你电脑当前的 Python 版本去生成一个小型的 Python 虚拟环境在你的这个专案上,因此你安装套件的时候就不会安装到 Global 环境上,这也就是我们在 npm 中常做的 npm install --save,但是这边提醒一下,建立完虚拟环境之後当你安装套件时,是会直接安装在虚拟环境上,而不用再去增加任何指令唷!

那麽建立虚拟环境的流程是这样:

建立虚拟环境 -> 安装 or 还原所需要的套件 -> 开始使用

因此这边我们先建立一个新的专案:

mkdir getYTVideo # 建立一个资料夹叫做 getYTVideo
cd getYTVideo # 移动到 getYTVideo 资料夹

到达这个资料夹之後依据官方指令输入:

python3 -m venv tutorial-env

这时候你的专案应该会多一个资料夹叫做 tutorial-env,如果你不喜欢的话你也可以改名,例如改叫 PyVideo,但我会建议後面多一个 -env 代表这是虚拟环境:

python3 -m venv PyVideo-env

https://ithelp.ithome.com.tw/upload/images/20210917/20119486H8rd6qUxwe.png

但是认真来讲,会建议保留预设资料夹名称就好,也就是 tutorial-env,因为如果你改名之後还必须额外做一些调整,否则你输入 pip3 list 可能还是会吃到本地的设置,所以保留 tutorial-env 会比较好,因为正确呈现会像这样:

https://ithelp.ithome.com.tw/upload/images/20210917/20119486rijCQg9fDu.png

而这个虚拟环境会依序你当前 Python 版本来生成,因此通常来讲会搭配版本控制,所以在後面也会接着介绍如何使用 pyenv 来切换版本。

安装套件

虚拟环境安装好之後,你就可以将套件安装在当前的虚拟环境,这边我们後面将会做一些练习,所以这边可以先尝试试着安装一些套件试试看:

pip3 install pytube

(是一款下载 Youtube Python 套件。)

安装成功之後可以试着输入 pip3 list 是否有安装成功,基本上可以看到 pytube 套件已经在当前的虚拟环境:

https://ithelp.ithome.com.tw/upload/images/20210917/20119486Cv9pwMG8yf.png

如果你觉得很混乱,你可以将 venv 当作 package.json 一样,当你安装套件它都会安装在 local 专案中,若没有使用 venv 的话,则是预设安装在 global 整台电脑上。

而我个人也会建议你使用 venv 区隔开发环境,毕竟你也不希望你的电脑安装一大推 Global 套件吧?

https://ithelp.ithome.com.tw/upload/images/20210917/20119486G6YFje4qnw.png

VSCode

这边也额外介绍一件事情,实际上来讲,你如果是使用 VSCode 来开发的话,你应该会发生不管怎麽执行 VSCode 的环境都是读全域的 Python,所以这边就要调整一下 VSCode 的设置方式·

以 VSCode 来讲官方文件是有提到建议你是输入以下指令:

python3 -m venv .venv # Mac
python -m venv .venv # Window

通常来讲当你输入以上指令後,就会看到生成一个 .venv 资料夹了,那麽可能会遇到一些问题,这在我先前的文章有分享过该如何解决,所以就不再次描述:

VSCode 设置 Python3 venv 虚拟环境参数

所以这边算是额外补充给使用 VSCode 开发的使用者。

版本管理

oh!前面我们只是介绍了关於 Python 的虚拟环境的部分,但是实际开发上有可能一个 Python 版本万用吗?当然是不可能的,以我先前写的 Hexo 系列 文章就有说明过 Node.js 8 与 Node.js 13 会有很大的效能差异,所以 Python 也是相同的,毕竟程序会更新、语法会新增以及错误会修正,这也代表着套件也会跟着版本更新。

但是有些时候我们在使用的套件或者是某些开发环境就是必须在特定的版本环境下才可以运作,那麽就会需要做版本切换的动作,如果以 JavaScript 来讲的话在 Node.js 开发上也是一样,所以我们通常会使用 nvm 套件来切换 Node.js 版本。

如果你还没有没用过 nvm 的话,我也推荐你使用,以下是我写过的笔记:

镜头转回来到 Python,那...Python 呢?也有 nvm 这个超方面的东西可以切换版本吗?

答案是没有 nvm 这个东西,但是有 pyenv 这个东西。

https://ithelp.ithome.com.tw/upload/images/20210917/20119486BNDsq7RM4X.png

等等,我是说没有 nvm 但不是说没有其他方式,所以接下来就介绍如何安装 pyenv 吧。

Mac 安装

基本上 Mac 安装一率建议 Homebrew 来安装,如果你是跳章节的话,建议你可以看一下前面章节。

那麽 Mac 安装得指令是:

brew update
brew install pyenv

安装过程如果你遇到 Updating Homebrew... 的话...就等它一下吧...

https://ithelp.ithome.com.tw/upload/images/20210917/20119486lzh1H2B1aQ.png

当你跑完之後就可以直接进入设定 Pyenv 罗。

哦对了,建议你也输入以下相依套件:

brew install openssl readline sqlite3 xz zlib

设定 Pyenv

通常来讲你必须额外针对终端机设置一些环境变数,毕竟我们在 Mac 常常会使用 ZSH or Bash 等等,所以就要额外调整:

Bash:

echo 'eval "$(pyenv init -)"' >> ~/.bashrc

ZSH

echo 'eval "$(pyenv init -)"' >> ~/.zshrc

基本上基本的设定这样就可以了。

Pyenv 常用指令

这边也先列出一下 Pyenv 常用的指令:

  • 安装特定版本的 Python
    • pyenv install [版本号]
    • 另一种详细模式的安装指令是 - pyenv install -v [版本号]
  • 列出可以安装的 Python 版本有哪些
    • pyenv install -list
  • 移除已经安装的 Python
    • pyenv uninstall [版本号]
  • 列出已经安装过的 Python 版本
    • pyenv versions
  • 切换 Python 版本
    • pyenv global [版本号]
      • 切换 Global Pyhton 版本
    • pyenv local [版本号]
      • 切换当前专案的 Pyhton 版本
    • pyenv shell [版本号]
      • 切换当前终端机 Python 版本

基本上用法是没有太难,所以这边就不做任何操作介绍了。

那麽这一章节就先到这边告一个段落罗~

如果你安装过程有问题的话,也可以参考我先前写的这一篇文章试试看「pyenv configure: error: C compiler cannot create executables

参考文献

作者的话

oh!今天把狗狗接回家後发现牠有够安静的,而且一直想躺都躺不下去,我想应该是因为牠在不舒服导致,现在只能晚上睡前帮牠先翻身睡觉,不然牠都只能坐着睡觉。

关於兔兔们

兔法无边


<<:  [iT铁人赛Day18]JAVA的函数(下篇)

>>:  Day 6 分好分清楚!

进击的软件工程师之路-软件战斗营 第十二周

学习进度 资料结构 Stack Queue Android Studio Activity(Life...

D16 - 那个圆圆的东西 - 物件原型 & 原型链

前言 Object.prototype.like = '舌尖上的JS' 请在任意的 JavaScri...

选择动物页面

可以先去https://www.ifreesite.com/upload/ 这里上传图片取得网址 点...

多工的陷阱

前言 今天来聊一个看起来不浪费的浪费。 多工会怎样 在我们的成长过程中,应该不只一次会听到前辈们的告...

[Day7] 注册API – model之Field

今天接续着我们昨天models.py的下半段,说明Field用法的部分,这对於在写model时候是另...