欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

pyenv命令管理多個(gè)Python版本

 更新時(shí)間:2017年03月26日 11:37:09   投稿:hebedich  
這篇文章主要介紹了pyenv命令管理多個(gè)Python版本依賴(lài)環(huán)境的相關(guān)資料,需要的朋友可以參考下

從接觸Python以來(lái),一直都是采用 virtualenv 和 virtualenvwrapper 來(lái)管理不同項(xiàng)目的依賴(lài)環(huán)境,通過(guò) workon 、 mkvirtualenv 等命令進(jìn)行虛擬環(huán)境切換,很是愉快。

然而,最近想讓項(xiàng)目能兼容更多的Python版本,例如至少同時(shí)兼容 Python2.7 和 Python3.3+ ,就發(fā)現(xiàn)采用之前的方式行不通了。

最大的問(wèn)題在于,在本地計(jì)算機(jī)同時(shí)安裝 Python2.7 和 Python3 后,即使分別針對(duì)兩個(gè)Python版本安裝了 virtualenv 和 virtualenvwrapper ,也無(wú)法讓兩個(gè)Python版本的 workon 、 mkvirtualenv 命令同時(shí)生效。另外一方面,要想在本地計(jì)算機(jī)安裝多個(gè)Python版本,會(huì)發(fā)現(xiàn)安裝的成本都比較高,實(shí)現(xiàn)方式也不夠優(yōu)雅。

幸運(yùn)地是,針對(duì)該痛點(diǎn),已經(jīng)存在一個(gè)比較成熟的方案,那就是 pyenv 。

如下是官方的介紹。

pyenv lets you easily switch between multiple versions of Python. It's simple, unobtrusive, and follows the UNIX tradition of single-purpose tools that do one thing well.

This project was forked from rbenv and ruby-build , and modified for Python.

本文就針對(duì) pyenv 最核心的功能進(jìn)行介紹。

基本原理

如果要講解 pyenv 的工作原理,基本上采用一句話(huà)就可以概括,那就是:修改系統(tǒng)環(huán)境變量 PATH 。

對(duì)于系統(tǒng)環(huán)境變量 PATH ,相信大家都不陌生,里面包含了一串由冒號(hào)分隔的路徑,例如 /usr/local/bin:/usr/bin:/bin 。每當(dāng)在系統(tǒng)中執(zhí)行一個(gè)命令時(shí),例如 python 或 pip ,操作系統(tǒng)就會(huì)在 PATH 的所有路徑中從左至右依次尋找對(duì)應(yīng)的命令。因?yàn)槭且来螌ふ遥虼伺旁谧筮叺穆窂骄哂懈叩膬?yōu)先級(jí)。

而 pyenv 做的,就是在 PATH 最前面插入一個(gè) $(pyenv root)/shims 目錄。這樣, pyenv 就可以通過(guò)控制 shims 目錄中的Python版本號(hào),來(lái)靈活地切換至我們所需的Python版本。

如果還想了解更多細(xì)節(jié),可以查看 pyenv 的文檔介紹及其源碼實(shí)現(xiàn)。

環(huán)境初始化

pyenv 的安裝方式包括多種,重點(diǎn)推薦采用 pyenv-installer 的方式,原因主要有兩點(diǎn):

通過(guò) pyenv-installer 可一鍵安裝 pyenv 全家桶,后續(xù)也可以很方便地實(shí)現(xiàn)一鍵升級(jí);
pyenv-installer 的安裝方式基于 GitHub ,可保證總是使用到最新版本的 pyenv ,并且 Python 版本庫(kù)也是最新最全的。
install && config

通過(guò)如下命令安裝 pyenv 全家桶。

$ curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash

內(nèi)容除了包含 pyenv 以外,還包含如下插件:

  1. pyenv-doctor
  2. pyenv-installer
  3. pyenv-update
  4. pyenv-virtualenv
  5. pyenv-which-ext

安裝完成后, pyenv 命令還沒(méi)有加進(jìn)系統(tǒng)的環(huán)境變量,需要將如下內(nèi)容加到 ~/.zshrc 中,然后執(zhí)行 source ~/.zshrc 。

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

完成以上操作后, pyenv 就安裝完成了。

$ pyenv -v
pyenv 1.0.8

如果不確定 pyenv 的環(huán)境是否安裝正常,可以通過(guò) pyenv doctor 命令對(duì)環(huán)境進(jìn)行檢測(cè)。

$ pyenv doctor
Cloning /Users/Leo/.pyenv/plugins/pyenv-doctor/bin/.....
Installing python-pyenv-doctor...

BUILD FAILED (OS X 10.12.3 using python-build 20160602)

Last 10 log lines:
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking openssl/ssl.h usability... no
checking openssl/ssl.h presence... no
checking for openssl/ssl.h... no
configure: error: OpenSSL development header is not installed.
make: *** No targets specified and no makefile found. Stop.
Problem(s) detected while checking system.

通過(guò)檢測(cè),可以發(fā)現(xiàn)本地環(huán)境可能存在的問(wèn)題,例如,從以上輸出可以看出,本地的 OpenSSL development header 還沒(méi)有安裝。根據(jù)提示的問(wèn)題,逐一進(jìn)行修復(fù),直到檢測(cè)不再出現(xiàn)問(wèn)題為止。

update

通過(guò) pyenv update 命令,可以更新 pyenv 全家桶的所有內(nèi)容。

$ pyenv update
Updating /Users/Leo/.pyenv...
From https://github.com/yyuu/pyenv
 * branch      master   -> FETCH_HEAD
Already up-to-date.
Updating /Users/Leo/.pyenv/plugins/pyenv-doctor...
From https://github.com/yyuu/pyenv-doctor
 * branch      master   -> FETCH_HEAD
Already up-to-date.
Updating /Users/Leo/.pyenv/plugins/pyenv-installer...
From https://github.com/yyuu/pyenv-installer
 * branch      master   -> FETCH_HEAD
Already up-to-date.
Updating /Users/Leo/.pyenv/plugins/pyenv-update...
From https://github.com/yyuu/pyenv-update
 * branch      master   -> FETCH_HEAD
Already up-to-date.
Updating /Users/Leo/.pyenv/plugins/pyenv-virtualenv...
From https://github.com/yyuu/pyenv-virtualenv
 * branch      master   -> FETCH_HEAD
Already up-to-date.
Updating /Users/Leo/.pyenv/plugins/pyenv-which-ext...
From https://github.com/yyuu/pyenv-which-ext
 * branch      master   -> FETCH_HEAD
Already up-to-date.

pyenv的核心使用方法

pyenv 的主要功能如下:

$ pyenv -h
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/yyuu/pyenv#readme

查看所有可安裝的 Python 版本

$ pyenv install --list
Available versions:
 2.1.3
 ...
 2.7.12
 2.7.13
 ...
 3.5.3
 3.6.0
 3.6-dev
 3.6.1
 3.7-dev

需要注意的是,如果是采用 brew 命令安裝的 pyenv ,可能會(huì)發(fā)現(xiàn) Python 版本庫(kù)中沒(méi)有最新的 Python 版本。所以建議還是通過(guò) GitHub 源碼方式安裝 pyenv 。

安裝指定版本的 Python 環(huán)境

$ pyenv install 3.6.0
Downloading Python-3.6.0.tar.xz...
-> https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz
Installing Python-3.6.0...
Installed Python-3.6.0 to /Users/Leo/.pyenv/versions/3.6.0

查看當(dāng)前系統(tǒng)中所有可用的 Python 版本

$ pyenv versions
* system (set by /Users/Leo/.pyenv/version)
 2.7.13
 3.6.0

切換 Python 版本

pyenv 可以從三個(gè)維度來(lái)管理 Python 環(huán)境,簡(jiǎn)稱(chēng)為: 當(dāng)前系統(tǒng) 、 當(dāng)前目錄 、 當(dāng)前shell 。這三個(gè)維度的優(yōu)先級(jí)從左到右依次升高,即 當(dāng)前系統(tǒng) 的優(yōu)先級(jí)最低、 當(dāng)前shell 的優(yōu)先級(jí)最高。

如果想修改系統(tǒng)全局的Python環(huán)境,可以采用 pyenv global PYTHON_VERSION 命令。該命令執(zhí)行后會(huì)在 $(pyenv root) 目錄(默認(rèn)為 ~/.pyenv )中創(chuàng)建一個(gè)名為 version 的文件(如果該文件已存在,則修改該文件的內(nèi)容),里面記錄著系統(tǒng)全局的Python版本號(hào)。

$ pyenv global 2.7.13
$ cat ~/.pyenv/version
2.7.13
$ pyenv version
2.7.13 (set by /Users/Leo/.pyenv/version)

$ pyenv global 3.6.0
$ cat ~/.pyenv/version
3.6.0
$ pyenv version
3.6.0 (set by /Users/Leo/.pyenv/version)

通常情況下,對(duì)于特定的項(xiàng)目,我們可能需要切換不同的Python環(huán)境,這個(gè)時(shí)候就可以通過(guò) pyenv local PYTHON_VERSION 命令來(lái)修改 當(dāng)前目錄 的Python環(huán)境。命令執(zhí)行后,會(huì)在當(dāng)前目錄中生成一個(gè) .python-version 文件(如果該文件已存在,則修改該文件的內(nèi)容),里面記錄著當(dāng)前目錄使用的Python版本號(hào)。

$ cat ~/.pyenv/version
2.7.13
$ pyenv local 3.6.0
$ cat .python-version
3.6.0
$ cat ~/.pyenv/version
2.7.13
$ pyenv version
3.6.0 (set by /Users/Leo/MyProjects/.python-version)
$ pip -V
pip 9.0.1 from /Users/Leo/.pyenv/versions/3.6.0/lib/python3.6/site-packages (python 3.6)

可以看出,當(dāng)前目錄中的 .python-version 配置優(yōu)先于系統(tǒng)全局的 ~/.pyenv/version 配置。

另外一種情況,通過(guò)執(zhí)行 pyenv shell PYTHON_VERSION 命令,可以修改 當(dāng)前shell 的Python環(huán)境。執(zhí)行該命令后,會(huì)在當(dāng)前 shell session (Terminal窗口)中創(chuàng)建一個(gè)名為 PYENV_VERSION 的環(huán)境變量,然后在 當(dāng)前shell 的任意目錄中都會(huì)采用該環(huán)境變量設(shè)定的Python版本。此時(shí), 當(dāng)前系統(tǒng) 和 當(dāng)前目錄 中設(shè)定的Python版本均會(huì)被忽略。

$ echo $PYENV_VERSION

$ pyenv shell 3.6.0
$ echo $PYENV_VERSION
3.6.0
$ cat .python-version
2.7.13
$ pyenv version
3.6.0 (set by PYENV_VERSION environment variable)

顧名思義, 當(dāng)前shell 的Python環(huán)境僅在當(dāng)前shell中生效,重新打開(kāi)一個(gè)新的shell后,該環(huán)境也就失效了。如果想在 當(dāng)前shell 中取消shell級(jí)別的Python環(huán)境,采用 unset 命令重置 PYENV_VERSION 環(huán)境變量即可。

$ cat .python-version
2.7.13
$ pyenv version
3.6.0 (set by PYENV_VERSION environment variable)

$ unset PYENV_VERSION
$ pyenv version
2.7.13 (set by /Users/Leo/MyProjects/.python-version)

管理多個(gè)依賴(lài)庫(kù)環(huán)境

經(jīng)過(guò)以上操作,我們?cè)诒镜赜?jì)算機(jī)中就可以安裝多個(gè)版本的 Python 運(yùn)行環(huán)境,并可以按照實(shí)際需求進(jìn)行靈活地切換。然而,很多時(shí)候在同一個(gè) Python 版本下,我們?nèi)匀幌M芨鶕?jù)項(xiàng)目進(jìn)行環(huán)境分離,就跟之前我們使用 virtualenv 一樣。

在 pyenv 中,也包含這么一個(gè)插件, pyenv-virtualenv ,可以實(shí)現(xiàn)同樣的功能。

使用方式如下:

$ pyenv virtualenv PYTHON_VERSION PROJECT_NAME

其中, PYTHON_VERSION 是具體的Python版本號(hào),例如, 3.6.0 , PROJECT_NAME 是我們自定義的項(xiàng)目名稱(chēng)。比較好的實(shí)踐方式是,在 PROJECT_NAME 也帶上Python的版本號(hào),以便于識(shí)別。

現(xiàn)假設(shè)我們有 XDiff 這么一個(gè)項(xiàng)目,想針對(duì) Python 2.7.13 和 Python 3.6.0 分別創(chuàng)建一個(gè)虛擬環(huán)境,那就可以依次執(zhí)行如下命令。

$ pyenv virtualenv 3.6.0 py36_XDiff
$ pyenv virtualenv 2.7.13 py27_XDiff

創(chuàng)建完成后,通過(guò)執(zhí)行 pyenv virtualenvs 命令,就可以看到本地所有的項(xiàng)目環(huán)境。

$ pyenv virtualenvs
 2.7.13/envs/py27_XDiff (created from /Users/Leo/.pyenv/versions/2.7.13)
* 3.6.0/envs/py36_XDiff (created from /Users/Leo/.pyenv/versions/3.6.0)
 py27_XDiff (created from /Users/Leo/.pyenv/versions/2.7.13)
 py36_XDiff (created from /Users/Leo/.pyenv/versions/3.6.0)

通過(guò)這種方式,在同一個(gè)Python版本下我們也可以創(chuàng)建多個(gè)虛擬環(huán)境,然后在各個(gè)虛擬環(huán)境中分別維護(hù)依賴(lài)庫(kù)環(huán)境。

例如, py36_XDiff 虛擬環(huán)境位于 /Users/Leo/.pyenv/versions/3.6.0/envs 目錄下,而其依賴(lài)庫(kù)位于 /Users/Leo/.pyenv/versions/3.6.0/lib/python3.6/site-packages 中。

$ pip -V
pip 9.0.1 from /Users/Leo/.pyenv/versions/3.6.0/lib/python3.6/site-packages (python 3.6)

后續(xù)在項(xiàng)目開(kāi)發(fā)過(guò)程中,我們就可以通過(guò) pyenv local XXX 或 pyenv activate PROJECT_NAME 命令來(lái)切換項(xiàng)目的 Python 環(huán)境。

➜ MyProjects pyenv local py27_XDiff
(py27_XDiff) ➜ MyProjects pyenv version
py27_XDiff (set by /Users/Leo/MyProjects/.python-version)
(py27_XDiff) ➜ MyProjects python -V
Python 2.7.13
(py27_XDiff) ➜ MyProjects pip -V
pip 9.0.1 from /Users/Leo/.pyenv/versions/2.7.13/envs/py27_XDiff/lib/python2.7/site-packages (python 2.7)

可以看出,切換環(huán)境后, pip 命令對(duì)應(yīng)的目錄也隨之改變,即始終對(duì)應(yīng)著當(dāng)前的Python虛擬環(huán)境。

對(duì)應(yīng)的,采用 pyenv deactivate 命令退出當(dāng)前項(xiàng)目的 Python 虛擬環(huán)境。

如果想移除某個(gè)項(xiàng)目環(huán)境,可以通過(guò)如下命令實(shí)現(xiàn)。

$ pyenv uninstall PROJECT_NAME

以上便是日常開(kāi)發(fā)工作中常用的 pyenv 命令,基本可以滿(mǎn)足絕大多數(shù)依賴(lài)庫(kù)環(huán)境管理方面的需求。

相關(guān)文章

  • Pytorch evaluation每次運(yùn)行結(jié)果不同的解決

    Pytorch evaluation每次運(yùn)行結(jié)果不同的解決

    今天小編就為大家分享一篇Pytorch evaluation每次運(yùn)行結(jié)果不同的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • Python使用PIL.image保存圖片

    Python使用PIL.image保存圖片

    PIL庫(kù)支持圖像存儲(chǔ)、顯示和處理,它能夠處理幾乎所有圖片格式,可以完成對(duì)圖像的縮放、剪裁、疊加以及向圖像添加線條、圖像和文字等操作,下面這篇文章主要給大家介紹了關(guān)于Python使用PIL.image保存圖片的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • Python中os.path模塊的8個(gè)神奇函數(shù)分享

    Python中os.path模塊的8個(gè)神奇函數(shù)分享

    在Python編程中,os.path模塊是一個(gè)非常重要的模塊,它提供了用于處理文件路徑和目錄的函數(shù),本文將介紹os.path模塊中最常用的8個(gè)內(nèi)置函數(shù),需要的可以參考下
    2023-11-11
  • 使用Python和wxPython實(shí)現(xiàn)下載視頻封面

    使用Python和wxPython實(shí)現(xiàn)下載視頻封面

    這篇文章主要為大家詳細(xì)介紹了如何使用Python和wxPython實(shí)現(xiàn)下載視頻封面,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • Python實(shí)現(xiàn)猜數(shù)字小游戲

    Python實(shí)現(xiàn)猜數(shù)字小游戲

    這篇文章介紹了Python實(shí)現(xiàn)猜數(shù)字小游戲,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以收藏下,方便下次瀏覽觀看
    2021-12-12
  • python scatter散點(diǎn)圖用循環(huán)分類(lèi)法加圖例

    python scatter散點(diǎn)圖用循環(huán)分類(lèi)法加圖例

    這篇文章主要為大家詳細(xì)介紹了python scatter散點(diǎn)圖用循環(huán)分類(lèi)法加圖例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • python實(shí)現(xiàn)進(jìn)程間通信簡(jiǎn)單實(shí)例

    python實(shí)現(xiàn)進(jìn)程間通信簡(jiǎn)單實(shí)例

    這篇文章主要介紹了python實(shí)現(xiàn)進(jìn)程間通信簡(jiǎn)單實(shí)例,需要的朋友可以參考下
    2014-07-07
  • 基于python實(shí)現(xiàn)新春煙花盛宴效果

    基于python實(shí)現(xiàn)新春煙花盛宴效果

    這篇文章給大家用Python綻放了一場(chǎng)新春煙花盛宴,這里提前祝大家新春快樂(lè)呀,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),感興趣的小伙伴可以自己動(dòng)手嘗試一下
    2024-02-02
  • Numpy數(shù)組轉(zhuǎn)置的兩種實(shí)現(xiàn)方法

    Numpy數(shù)組轉(zhuǎn)置的兩種實(shí)現(xiàn)方法

    下面小編就為大家分享一篇Numpy數(shù)組轉(zhuǎn)置的兩種實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Python使用os.listdir()和os.walk()獲取文件路徑與文件下所有目錄的方法

    Python使用os.listdir()和os.walk()獲取文件路徑與文件下所有目錄的方法

    今天小編就為大家分享一篇關(guān)于Python使用os.listdir()和os.walk()獲取文件路徑與文件下所有目錄的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04

最新評(píng)論