TS3: Pyenv 最終介紹

Tech Soup ~ 技術鳮湯 ;-)

指望這篇解決全部 Pyenv 核心困惑.html

snip

Pyenv 是 Python 項目環境隔離/控制器 , 最基本的使用:python

  • 基於官方倉庫安裝:git

    • $ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
  • 而後配置到環境中:github

    • $ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
    • $ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
  • 接着就能夠自由控制運行時環境了:sql

    • 安裝目標版本,好比:shell

      • pyenv install 2.4.2
    • 複製一個項目環境:ubuntu

      • pyenv virtualenv 2.4.2 242proj
    • 設定當前目錄之內默認使用新環境:segmentfault

      • pyenv local 242proj

就以上三個環節的配置, 就能夠完成:windows

  • 自由安全安裝系統無關, 自用 Python 版本環境
  • 根據不一樣項目, 自由安全綁定不一樣 Python 運行時
  • 根據同類項目, 自由綁定含有相同 pip 模塊依賴樹的Python 運行時

background

爲何有 Pyenv 等等環境控制工具?

你們開始學習 Python 時, 可能最驚訝/震驚/自豪 的發現就是xcode

  • 大部分操做系統, 都內置了 Python 運行環境
  • 也就是說, 不用咱們專門安裝, 從買到電腦那一瞬間開始
  • 其實, 咱們都有一個完備的可用 Python 版本環境了

由於, Python 太好用, 不管哪一個系統廠商, 都有大量的內置工具/軟件依賴 Python

  • 因此, 也都預先安裝了...
  • 那麼, 這也就帶來一個問題:

    • 系統 Python 環境, 是不少系統依賴軟件須要的環境
    • 這一環境, 確定不能輕易破壞, 不然, 引起系統崩潰
    • 那就等於咱們本身殺死了本身的電腦...
  • 這其實, 也是不少教程中涉及安裝 Python 模塊時

    • 有的, 不負責的提示使用 sudo 命令
    • 這是臨時將用戶權限提高到系統管理員的指令
    • 形成的後果, 是通常人難以控制的
    • 固然, windows 系統自己是單人系統,並無嚴格區分系統和用戶權限
    • 因此, 在 windows 中看起來能夠自由使用系統 Python 環境來開發學習
    • 其實, 只是另一種慢性自殺而已

problems

因爲 Python 發展過久, 中間有太多意外決策, 同時開源項目又不由止你們的探索...

因此, 如今任何系統中的 Python 運行時環境均可以混亂不堪...

正如 xkcd: Python Environment 所描述的那樣...

可是, 對於正常學習/使用者而言, 通常只想解決幾個問題:

  • 和系統環境隔離

    • 運行 Python 時, 不觸及系統自身依賴的s
  • Python 版本隔離

    • 想用哪一個版本的 Python 不用擔憂干撓誰
  • 項目模塊依賴隔離

    • 不一樣項目之間用 pip 安裝的模塊相互獨立
    • 能夠分別自由升級/降級/刪除/...
    • 而不幹撓各自的開發/運行

那麼, 在不少年探索後, Pyenv 正好是解決以上問題的那個工具

Pyenv

正如項目名稱同樣:

  • Python
  • environment

Python 環境 ~ 控制器, 控制了核心兩種環境:

  • Python 版本環境, 也就是說, Python 2.1/3.1 這種大版本
  • Python 運行時模塊依賴環境, 也就是說, 具體項目中依賴的第三方一大堆模塊

那麼, 如何最短手續就進入 Pyenv 的世界享受可控 Python 環境?

pyenv-installer

pyenv/pyenv-installer: This tool is used to install pyenv and friends.

首次安裝, 建議使用官方提供的安裝器

  • 不用管 homebrew 哪什麼其它東西, 那些和 Pyenv 並沒有直接關係
  • 況且 brew 在中國, 仍是很不受到待見的...那速度哭吧...

如何檢驗 pyenv 安裝成功?

$ env | grep pyenv

PYENV_ROOT=/指向/你/的/.pyenv
PATH=...:/指向/你/的/.pyenv/shims:/指向/你/的/.pyenv/bin:...
用 env 檢驗系統環境變量中包含 pyenv 要求的兩個關鍵性配置

$ pyenv

pyenv 1.0.3-535-g17f44b7c
Usage: pyenv <command> [<args>]

Some useful pyenv commands are:
   commands    List all available pyenv commands
   local       Set or show the local application-specific Python version
   global      Set or show the global Python version
   shell       Set or show the shell-specific Python version
   install     Install a Python version using python-build
   uninstall   Uninstall a specific Python version
   rehash      Rehash pyenv shims (run this after installing executables)
   version     Show the current Python version and its origin
   versions    List all Python versions available to pyenv
   which       Display the full path to an executable
   whence      List all Python versions that contain the given executable

See `pyenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/pyenv/pyenv#readme
運行 pyenv 給出標準使用幫助

這樣, 就說明安裝好了

pyenv-virtualenvwrapper

pyenv/pyenv-virtualenvwrapper: an alternative approach to manage virtualenvs from pyenv.

安裝 Pyenv 當前是想用多版本 Python 環境了,那麼,必定要安裝這個插件

安裝很是簡單:

$ git clone https://github.com/pyenv/pyenv-virtualenvwrapper.git $(pyenv root)/plugins/pyenv-virtualenvwrapper

就一個 git clone 操做,而後也配置到系統環境中:

export PATH="~/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

在原先 pyenv 以後追加一行, 啓動 virtualenv-init 就好;

系統環境

已經見到這個詞不少次了, 可是, 多數文檔並不說明這是什麼東西...
致使 Pyenv 一直沒使用起來....

系統環境 -> System environment

  • 是的, 就是剛剛用 env 指令彙報出來的, 當前系統運行時使用的全部 全局配置
  • 由於是系統當前在用的, 因此, 必定是有一種儀式/指令來更新的
  • 不可能咱們自行修改/自動化變動了 ~/.bash_profile 之類系統配置文件就能自動加載的

這個儀式指令就是:

$ source ~/.bash_profile

source ~ 資源

  • 是的, 這個資源指令, 就是加載系統全部資源的指令
  • 若是安裝 Pyenv 後, 歷來沒執行過這個指令,
  • 那只有下次電腦重啓時,纔可能真正加載上 pyenv

Common build

最大的坑來了...

Common build problems · pyenv/pyenv Wiki

在官方wiki 第一條, 就是這篇文章, 爲何?

  • 由於咱們想 Python 版本環境自由, 又想和系統隔離
  • 那麼, 必然不可能簡單複製系統即有環境來用
  • 只能, 自行編譯全新 Python 來給本身使用
  • 問題來了: 現場編譯一個 Python 版本出來, 依賴什麼東西?
  • 直覺上, 固然須要額外的支持了...

    • 畢竟 Python 是用 C 語言編寫的
    • 而 C 軟件的編譯, 須要一堆相關依賴模塊的源代碼支持
    • 不然, 編譯是沒法開展的...
  • 這也是爲何不少人安裝 Pyenv 後卻沒法安裝新 Python 版本的根本緣由:

    • 巧婦難爲無米之炊
    • Pyenv 再智能, 也不可能替 Python 無中生有出來系統關聯的第3方模塊源代碼

好在, Python 編譯時依賴的都是通用基礎模塊,
不管哪一個系統, 都有對應開源倉庫能夠快速安裝;

對於 macOS 只須要:

$ brew install openssl readline sqlite3 xz zlib

只是, 前提是事先配置好 XCode Command Line Tools:

$ xcode-select --install

由於, 全部編譯工做, 實際上是使用 XCode 來進行的, 不然,沒法兼容 macOS 環境哪...

usage

好了, 以上準備工做完成了, 其實就3步:

  • 安裝 pyenv, 以及 pyenv-virtualenvwrapper 插件
  • 檢驗, 並激活 Pyenv
  • 準備當前編譯環境

那麼接下來的使用就異常順滑了;-)

安裝新 Python 環境:

$ pyenv install --list
Available versions:
  2.1.3
  2.2.3
  2.3.7 

  ...
  
  stackless-3.4.7
  stackless-3.5.4

看看 pyenv 支持多少種版本環境的安裝? 上百種了, 這是其它工具做不到的

安裝 Python 3.7.4 環境:

$ pyenv install 3.7.3
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.7.3.tar.xz...
-> https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz
....

檢驗安裝結果:

$ pyenv rehash
$ pyenv versions
* system
  3.7.3
注意:

* system 說明當前目錄使用系統 Python 環境中...

複製一個項目環境:

$ pyenv virtualenv 3.7.3 373camp
Looking in links: /var/folders/pl/8rsjzmjn2ybgd71lwqf3lxw80000gn/T/tmp_qtmj124
Requirement already satisfied: setuptools in /Users/zoomq/.pyenv/versions/3.7.3/envs/373camp/lib/python3.7/site-packages (40.8.0)
Requirement already satisfied: pip in /Users/zoomq/.pyenv/versions/3.7.3/envs/373camp/lib/python3.7/site-packages (19.0.3)

由於, 這個 3.7.3 環境是乾淨的單純 Python 自身, 做爲母本,
來複製出其它項目中環境纔是正確的思路;

同時, 也由於 pyenv 複製已經安裝好的環境是不用編譯的, 很是快.

檢驗複製結果:

$ pyenv versions
* system
  3.7.3
  3.7.3/envs/373camp

綁定到當前目錄:

༼system༽~/mnt/_historic/101.camp/_video༽
༄  pyenv local camp373
༼camp373༽~/mnt/_historic/101.camp/_video༽
  system
  3.7.3
  3.7.3/envs/373camp
* camp373 (set by /Users/zoomq/mnt/_historic/101.camp/_video/.python-version)
這裏出現的奇怪提示, 是大媽本地 bash 配置的特殊命令行提示結構, 沒必要關心...

關鍵是 * camp373 , 那個 * 從 system 移動到 camp373 以前,
說明當前運行時環境, 已經從系統默認, 變成剛剛複製出來的一個全新 Python 3.7.3 環境了,

而實際上這一環境編譯安裝在:

/Users/zoomq/.pyenv/versions/camp373

和系統的以及 brew 安裝的都不相同.

注意:

千萬別輕易使用: pyenv global 指定版本別名

這是將 系統 Python 運行環境切換到 pyenv 安裝的環境上...
太危險了...

summary

以上, 簡單說:

  • Python 運行時環境是開始學習/開發/測試前必定要關注的
  • 而 Pyenv 提供了統一簡潔的指令工具, 能夠快速任意:

    • 安全安裝不一樣 Python 版本環境
    • 並基於 virtualenv 以 pyenv-virtualenvwrapper 形式提供了一系列包依賴控制

      • 支持咱們快速對不一樣項目的不一樣模塊依賴
      • 也能夠友好/安全的完成隔離
    • 更加精彩的是, 完成配置後 pyenv 將自動切換對應環境

      • 這樣, 咱們進入對應項目目錄時
      • 根本不用擔憂運行時環境沒有綁定上
    • 這一切, 最終 pyenv 只很是自制的使用

      • 目錄中 .python-version 文件來完成輔助識別並自動切換
      • 其內容也就是 camp373 這種咱們自行擬定的環境別名而已

TS;DL

那麼 Pipenv/Anaconda/... 其它工具呢?

Python 生態最好也最糾結的一個狀態就是:

  • 任何一個問題都有不少優秀解決方案
  • 並且, 每個都看起來佷優秀
  • 致使咱們不管選擇了哪個都好象放棄了整個兒世界似的...

好在各個開源項目的文檔/示例都很友好, 也有大量對比文章能夠參考,

俺的私人偏見:

  • virtualenv 最先完成環境虛擬化;

    • 可是, 運行環境和項目目錄綁定, 並得用指令進入/退出
    • 總體上, 不夠靈活
  • Anacoda/Miniconda 是通用預部署環境工具

    • 若是咱們須要快速得到上百個第三方大型模塊已經有的環境
    • 那麼, 使用 Anacoda
    • 不然, 不如用 Pyenv
    • 固然, 想節省 Python 版本環境的編譯

      • 能夠安裝 Miniconda 來替代 Pyenv 的 install Python 過程
      • 而後, 在 conda 版本環境中, 用 Pyenv 來管理項目模塊依賴環境
    • 問題是, conda 環境的進入/退出, 必須用指令來完成
    • 並且, 進入後, 運行 Python 也不是直接用
    • 而是必須 conda run python 個人腳本.py 這種
    • 比較傻....
  • Pipenv 從名字上來看就知道專一 pip 的管理

    • 雖然, 對項目模塊狀態管理更加靈活
    • 可是, 進入/退出, 必須人工指令
    • 並且, 在環境中運行, 也必須用 pipenv run python 個人腳本.py 這種形式
    • 固然, 也有人反感 Pyenv 這種自動切換環境的行爲, 認爲不可控
  • venv 這是 Python 3 only 的官方內建虛擬環境工具

    • 沒人用...
  • poetry 也是相似 pipenv 的包依賴控制工具, 不包含 Python 版本環境管理

refer:

env

俺用 Pyenv 控制的環境:

༄  pyenv versions
  system
  2.7.10
  2.7.10/envs/uC2710
  2.7.12
  2.7.12/envs/dama2712
  2.7.15
  2.7.15/envs/leo2715
  3.6.3
  3.6.3/envs/AI363
  3.6.3/envs/DU363
  3.6.3/envs/du4pos
  3.7.0
  3.7.0/envs/leo370
  3.7.3
  3.7.3/envs/373camp
  3.7.3/envs/Django373
  3.7.3/envs/camp373
  3.7.3/envs/pycon373
  373camp
  AI363
  DU363
  Django373
* camp373 (set by /Users/zoomq/mnt/_historic/101.camp/_video/.python-version)
  dama2712
  du4pos
  leo2715
  leo370
  pycon373
  uC2710

PS:

當前課程對應公衆號 蟒營101camp 暫定專欄有:
  • DM 大媽嗯哼 ~ 文本快速呢喃點心境...
  • NC 嗯哼蟒營 ~ 圖文/圖片有關課程信息
  • SS 學員故事 ~ 各期課程中發生的真實"血案"
  • TS 技術鳮湯 ~ 轉載/原創自學技術/心法相關嗯哼

歡迎投稿, 郵件給課程組就好:

guru101camp@googlegroups.com
NN 3778

蟒營™:Python 入門班||圖譜||幻燈||維基

101camp3py 進行中

  • 190922 已開課
  • 191003 將結束

Powered by: Zoom.Quiet / 昧因科技®

相關文章
相關標籤/搜索