centos7下安裝并配置pyenv多版本管理python3.+
目錄
一、簡介
二、安裝pyenv和python
三、配置pyenv多版本控制
一、簡介
1、簡介
pyenv作為常用的python版本管理工具,對開發效率的提升有很大幫助,可以實作在多個版本的Python之間切換,簡單實用,并且遵循UNIX的單一用途工具的傳統,做的很棒。
ps:pyenv項目是從rebenv和ruby-build分支出來的,并且為Python修改過。
pyenv可以做到:
1、讓您基于每個使用者更改全局Python版本。
2、為每個項目的Python版本提供支援。
3、允許您使用環境變量覆寫Python版本。
4、一次從多個版本的Python中搜尋指令。 這可能有助于使用tox測試Python版本。
與pythonbrew和pythonz相比,pyenv:
1、取決于Python本身。 pyenv是由純shell腳本制作的。 沒有Python的引導問題。
2、需要加載到你的shell中。 相反,pyenv的shim方法通過向$ PATH添加目錄來工作。
3、管理virtualenv。 當然,你可以自己建立virtualenv,或者pyenv-virtualenv來自動化該過程。
摘自https://github.com/pyenv/pyenv
2、pyenv工作原理
介紹pyenv工作原理之前必然要先簡單介紹一下PATH環境變量的相關知識。
當您運作類似python或pip的指令時,您的作業系統會搜尋目錄清單以查找具有該名稱的可執行檔案。此目錄清單位于一個名為的環境變量PATH中,清單中的每個目錄用冒号分隔:
/usr/local/bin:/usr/bin:/bin
PATH從左到右搜尋目錄,是以清單開頭的目錄中的比對可執行檔案優先于最後的另一個目錄。在這個例子中,該 /usr/local/bin目錄将首先搜尋,然後/usr/bin,然後/bin。
pyenv的工作原理是在原有的PATH變量搜尋目錄的前面 插入一個shim目錄PATH:
$(pyenv root)/shims:/usr/local/bin:/usr/bin:/bin
通過一個名為rehashing的程序,pyenv在該目錄中維持shims程式,以比對每個已安裝的Python-python,pip等版本的每個Python指令。
shims是輕量級可執行檔案,隻需将指令傳遞給pyenv即可。 是以安裝了pyenv後,當你運作pip時,你的作業系統會執行以下操作:
在PATH中搜尋名為pip的可執行檔案
在PATH的開頭找到名為pip的pyenv shim
運作名為pip的shim,然後将指令傳遞給pyenv
綜合上述:pyenv使用注入到PATH中的SHIM程式可執行檔案攔截Python指令,确定應用程式指定了哪個Python版本,并将指令傳遞給正确的Python安裝。
而PATH變量在開機或者登入使用者時會自動加載,加載順序一般為/ect/profile -> /ect/profile.d/*.sh -> /ect/profile.d/lang.sh -> /ect/sys config/i18n -> ~/.bash_profile -> ~/.bashrc -> ~/ect/bashrc
二、安裝pyenv和python
1、安裝git
$ yum install git -y
# 使用yum安裝,可以看到如下代碼;
Loaded plugins: fastestmirror
Determining fastest mirrors
* base: mirrors.aliyun.com
* extras: mirrors.163.com
* updates: mirrors.cn99.com
base | 3.6 kB 00:00:00
extras | 3.4 kB 00:00:00
updates | 3.4 kB 00:00:00
(1/4): base/7/x86_64/group_gz | 166 kB 00:00:00
(2/4): extras/7/x86_64/primary_db | 215 kB 00:00:00
(3/4): base/7/x86_64/primary_db | 6.0 MB 00:00:01
(4/4): updates/7/x86_64/primary_db | 7.4 MB 00:00:16
Resolving Dependencies
--> Running transaction check
---> Package git.x86_64 0:1.8.3.1-19.el7 will be updated
--> Processing Dependency: git = 1.8.3.1-19.el7 for package: perl-Git-1.8.3.1-19.el7.noarch
---> Package git.x86_64 0:1.8.3.1-20.el7 will be an update
--> Running transaction check
---> Package perl-Git.noarch 0:1.8.3.1-19.el7 will be updated
---> Package perl-Git.noarch 0:1.8.3.1-20.el7 will be an update
--> Finished Dependency Resolution
Dependencies Resolved
==========================================================================================================================
Package Arch Version Repository Size
==========================================================================================================================
Updating:
git x86_64 1.8.3.1-20.el7 updates 4.4 M
Updating for dependencies:
perl-Git noarch 1.8.3.1-20.el7 updates 55 k
Transaction Summary
==========================================================================================================================
Upgrade 1 Package (+1 Dependent package)
Total download size: 4.4 M
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
warning: /var/cache/yum/x86_64/7/updates/packages/perl-Git-1.8.3.1-20.el7.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Public key for perl-Git-1.8.3.1-20.el7.noarch.rpm is not installed
(1/2): perl-Git-1.8.3.1-20.el7.noarch.rpm | 55 kB 00:00:00
(2/2): git-1.8.3.1-20.el7.x86_64.rpm | 4.4 MB 00:00:01
--------------------------------------------------------------------------------------------------------------------------
Total 3.5 MB/s | 4.4 MB 00:00:01
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:
Userid : "CentOS-7 Key (CentOS 7 Official Signing Key) <[email protected]>"
Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
Package : centos-release-7-6.1810.2.el7.centos.x86_64 (@anaconda)
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Updating : git-1.8.3.1-20.el7.x86_64 1/4
Updating : perl-Git-1.8.3.1-20.el7.noarch 2/4
Cleanup : git-1.8.3.1-19.el7.x86_64 3/4
Cleanup : perl-Git-1.8.3.1-19.el7.noarch 4/4
Verifying : perl-Git-1.8.3.1-20.el7.noarch 1/4
Verifying : git-1.8.3.1-20.el7.x86_64 2/4
Verifying : git-1.8.3.1-19.el7.x86_64 3/4
Verifying : perl-Git-1.8.3.1-19.el7.noarch 4/4
Updated:
git.x86_64 0:1.8.3.1-20.el7
Dependency Updated:
perl-Git.noarch 0:1.8.3.1-20.el7
Complete!
代碼主要為:①、base :是FC更新用的官方核心yum源,系統核心和基本的軟體包庫;update :官方更新更新用的軟體庫;extras :官方附加軟體庫;依次檢視相關的庫源,下載下傳并更新庫(第一次運作yum安裝)。
②、檢視并解決依賴性問題,通過運作事務檢測來檢測最新包和包的相關依賴性,如git.x86_64 0:1.8.3.1-20.el7依賴于perl-Git.noarch 0:1.8.3.1-20.el7。解決完畢即出現Dependencies Resolved
③、開始下載下傳上面兩個包,期間出現:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
warning: /var/cache/yum/x86_64/7/updates/packages/perl-Git-1.8.3.1-20.el7.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
yum安裝尚未暫停可以忽視。首先會調用Delta RPMs,但是這台linux上沒有安裝是以作罷(ps:如果已經安裝了deltarpms則會增加包的壓縮率,使得下載下傳的包變小,并且不會出現NOKEY的警告了);其次應該是顯示在下載下傳的檔案中沒有相關的public-KEY,但是這不影響下載下傳和安裝。
④、依次開始:檢索密鑰(從file:/// etc / pki / rpm-gpg / RPM-GPG-KEY-CentOS-7中檢索密鑰),導入GPG密鑰。運作事務檢查、運作事務測試、事務測試成功、運作事務
最後安裝成功。
可見我們常用的yum(全稱為 Yellow dog Updater, Modified)安裝會自動下載下傳RPM包并安裝,自動解決和處理依賴性問題。也遵循UNIX的單一用途工具的傳統,簡介明了。
2、安裝python編譯依賴包
執行以下語句即可:
yum -y install gcc make patch gdbm-devel openssl-devel sqlite-devel readline-devel zlib-devel bzip2-devel
3、建立python使用者
$ useradd python
為了示範1、基于每個使用者更改全局Python版本。
4、在python使用者下安裝pyenv
執行以下指令:
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
pyenv可以通過多種方式安裝,可以參考項目在github上的Installtion, 位址為: https://github.com/pyenv/pyenv-installer。
推薦采用本文提供的方法,可以一鍵安裝pyenv的所有插件。
pyenv套件下插件:
- pyenv-doctor
- pyenv-installer
- pyenv-update
- pyenv-virtualenv
- pyenv-which-ext
推薦采用The automatic installer的方式安裝,可以一鍵安裝pyenv的所有插件。
安裝完後需要在/home/python/.bashrc下(如果不用
python
使用者就是
其他
)寫入,vim /home/python/.bashrc寫入以下
# Load pyenv automatically by adding
# the following to ~/.bashrc:
export PATH="/home/python/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
然後source /home/python/.bashrc
此時可以檢視一下PATH路徑,運作指令
$ echo $PATH
/home/python/.pyenv/plugins/pyenv-virtualenv/shims:/home/python/.pyenv/shims:/home/python/.pyenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
可以看到,/home/python/.pyenv/plugins/pyenv-virtualenv/shims已經在目錄開頭。
如果在非使用者家目錄下切換python使用者會出現
/home/python/.pyenv/bin/pyenv: line 90: cd: /root: Permission denied
此時/home/python/.pyenv/plugins/pyenv-virtualenv/shims并不會運作。需要在python家目錄中登入python,才能運作/home/python/.pyenv/plugins/pyenv-virtualenv/shims。同樣你可以在root使用者下安裝pyenv并在 ~/.bashrc配置PATH變量就不會出現這種問題了。
那麼問題又來了,如何知道環境變量調用的順序呢?
如果不清楚可以在環境變量檔案中加入
echo [Environment variable name環境變量名稱]
指令,此處要加的檔案比較多建議批量加入,使用echo > 重定向方式,更友善。然後重新開啟會話或者重新開機,此時可以看到一般的運作步驟為
/ect/profile -> /ect/profile.d/*.sh -> /ect/profile.d/lang.sh -> /ect/sys config/i18n -> ~/.bash_profile -> ~/.bashrc -> ~/ect/bashrc
。
通過su指令切換使用者時,會運作~/.bashrc 但不會運作bash_profile。是以此處的環境變量最好加入到/.bashrc中更好。
!!筆者隻試驗了一部分,如有不夠準确的地方請海涵。
5、在python使用者下安裝python3.7.4
pyenv install # 使用python-build安裝Python版本
pyenv uninstall # 解除安裝特定的Python版本
如果安裝3.7以上的版本會出現
BUILD FAILED (CentOS Linux 7 using python-build 20180424)
Inspect or clean up the working tree at /tmp/python-build.20190830172656.9639
Results logged to /tmp/python-build.20190830172656.9639.log
此時需要安裝一個依賴包libffi-devel
yum install libffi-devel
!! 那麼問題來了,如何知道自己安裝的軟體所需要的依賴包呢?
可以通過yum deplist,rpm -qR 來檢視軟體的依賴包有哪些。deb包和rpm一般内置依賴資訊,apt和yum能自動為你補齊依賴。但是沒有打包的軟體,或者打包打的不好的,你可以用ldd檢視依賴的庫,再手動補齊。ldd也沒列出來的,可以用strace指令跟蹤,看缺少了什麼檔案。一般來說檢視軟體的官方幫助文檔是最穩妥的方式。
三、配置pyenv多版本控制
1、常用指令
pyenv versions # 顯示目前可用的python版本
pyenv version # 顯示目前使用的python版本
2、切換版本
pyenv commands # 列出所有可用的pyenv指令
pyenv local # 設定或顯示本地特定于應用程式的Python版本
pyenv global # 設定或顯示全局Python版本
pyenv shell # 設定或顯示特定于shell的Python版本
pyenv rehash # Rehash pyenv shims(安裝可執行檔案後運作)
pyenv which # 顯示可執行檔案的完整路徑
pyenv whence # 列出包含給定可執行檔案的所有Python版本
執行shims程式時,pyenv按以下順序從以下源中讀取它來确定要使用的Python版本:
①、在PYENV_VERSION環境變量(如果指定)。可以使用
pyenv shell
指令在目前shell會話中設定此環境變量。
②、目前目錄中的特定于應用程式的.python-version檔案(如果存在)。可以使用
pyenv local
指令修改目前目錄的.python-version檔案。
③、通過搜尋每個父目錄找到的第一個.python-version檔案(如果有)。直到到達檔案系統的根目錄。
④、全局$ (pyenv root)/version檔案。可以使用
pyenv globa
l指令修改此檔案。如果不存在全局版本檔案,pyenv假定您要使用“系統”Python。(換句話說,如果pyenv不在您的身上,那麼無論運作什麼版本 PATH。)
注意:可以同時激活多個版本,包括同時使用多個版本的Python2或Python3。這允許并行使用Python2和Python3,并且需要使用類似的工具tox。一旦pyenv确定了您的應用程式指定了哪個版本的Python,它就會将指令傳遞給相應的Python安裝。如果使用pyenv install安裝python,安裝目錄在$(pyenv root)/ versions(本文中是/home/python/.pyenv)下的自己的目錄中。
3、虛拟環境的配置
在pyenv中有一個名為pyenv-virtualenv的插件,有很多功能,可以幫助pyenv使用者管理virtualenv或Anaconda建立的虛拟環境。因為這些虛拟環境的激活腳本依賴于改變使用者互動式shell的$ PATH變量,是以它将攔截pyenv的shim樣式指令執行挂鈎。
為什麼要使用虛拟環境? 因為剛才使用的Python環境都是一個公共的空間,如果多個項目使用不同Python版本開發,或者使用不同的Python版本部署運作,或者使用同樣的版本開發的但不同項目使用了不同版本的庫,等等這些問題都會帶來沖突。最好的解決辦法就是每一個項目獨立運作自己的“獨立小環境”中。
配置方法:
使用插件,在~/.pyenv/plugins/pyenv-virtualenv中。
運作指令
$ pyenv virtualenv 3.7.4[python版本号] test[虛拟名稱]
Looking in links: /tmp/tmpwm8qdqzq
Requirement already satisfied: setuptools in /home/python/.pyenv/versions/3.7.4/envs/test/lib/python3.7/site-packages (40.8.0)
Requirement already satisfied: pip in /home/python/.pyenv/versions/3.7.4/envs/test/lib/python3.7/site-packages (19.0.3)
會傳回路徑。
此時使用:
pyenv versions
可以看到在版本号中出現了test:
system
* 3.6.9 (set by /home/python/.pyenv/version)
3.6.9/envs/test1
3.7.4
3.7.4/envs/test
test
test1
然後再建立檔案夾:
mkdir -p ~/shsf/projects/web
進入檔案夾中執行:
pyenv local test
此時進入~/shsf/projects/web檔案夾中就是使用test所代表的3.7.4版本的python了。
[[email protected] ~]$ mkdir -p shsf/project/test
[[email protected] ~]$ ll
total 0
drwxrwxr-x. 3 python python 21 Aug 30 19:59 shsf
[[email protected] ~]$ cd shsf/project/test
[[email protected] test]$ pyenv local test
(test) [[email protected] test]$
4、更好的進行python包管理
為了更好的進行python包管理,我們往往會安裝pip和ipython。
pip 是Python的包管理工具,3.x的版本自帶可以直接使用。 和yum一樣為了使用國内鏡像,進行如下配置:
$ mkdir ~/.pip
$ vi ~/.pip/pip.conf # 在此檔案下寫入如下代碼
[global]
index-url=https://mirrors.aliyun.com/pypi/simple/
trusted-host=mirrors.aliyun.com
此時可以通過pip list 檢視,如果提示更新則按提示更新即可。
# windows系統 windows下pip的配置檔案在~/pip/pip.ini,内容同上
安裝ipython:
$ pip install ipython
注意:你在哪個項目檔案夾中pip安裝ipython,那個項目檔案夾就可以使用,用指令ipython即可,必須要pip安裝後,相應的才能使用,jupyter同樣。
Jupyter 是基于WEB的互動式筆記本,其中可以非常友善的使用Python。具體使用并配置jupyter請檢視文檔https://jupyter-notebook.readthedocs.io/en/stable/public_server.html
可以直接用pip安裝:
$ pip install jupyter
使用虛拟環境的好處在與項目與項目之間運作環境隔離,每個項目有獨立的環境使用不同的版本,并且可以使用pip指令導出已經安裝的包,并且在另一個環境中安裝這些包(安裝包pip install [pkg-name])。
附錄:本文所用系統為centos 7