天天看點

centos7下安裝并配置pyenv多版本管理python3.7+centos7下安裝并配置pyenv多版本管理python3.+

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