溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python中pyenv虛擬環(huán)境管理工具的使用方法

發(fā)布時(shí)間:2020-05-26 11:34:30 來源:億速云 閱讀:466 作者:Leah 欄目:編程語言

今天小編給大家分享的是python中pyenv虛擬環(huán)境管理工具的使用方法,相信大部分人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,話不多說,一起往下看吧。

在學(xué)習(xí)Python的時(shí)候,最經(jīng)常遇到的問題就是包版本的問題,比如說這個(gè)應(yīng)用需要libtool包的1.1.1版本,而之前開發(fā)的應(yīng)用則只能運(yùn)行在1.0.1版本上。那么怎么讓兩個(gè)應(yīng)用都能夠正常運(yùn)行起來呢?聰明的開發(fā)者們提出了虛擬環(huán)境的概念,就像電腦的虛擬機(jī)一樣,創(chuàng)建一個(gè)虛擬環(huán)境就像創(chuàng)建了虛擬機(jī)。你在虛擬環(huán)境里做任何操作都不會(huì)影響到其他的虛擬環(huán)境,也不會(huì)影響到系統(tǒng)環(huán)境。同時(shí)你也可以在你的虛擬環(huán)境里安裝任何版本的包來進(jìn)行測(cè)試。
在昨天的文章里介紹了Python使用的比較多的一個(gè)虛擬環(huán)境管理包virtualenv,這個(gè)包用在windows系統(tǒng)上比較多。而在Linux/Unix系統(tǒng)上用的比較多的是另外一個(gè)虛擬環(huán)境管理工具pyenv。

什么是pyenv

pyenv是一個(gè)虛擬環(huán)境管理工具,可以同時(shí)管理多個(gè)Python版本,并能以這些Python版本為模板來創(chuàng)建不同的虛擬環(huán)境,而且可以靈活的在這些虛擬環(huán)境之間進(jìn)行切換。它具有以下優(yōu)點(diǎn):

  • 可以直接修改全局Python版本(慎重操作,危險(xiǎn))
  • 每個(gè)項(xiàng)目一個(gè)Python版本
  • 從多個(gè)Python版本中同時(shí)搜索命令,方便測(cè)試跨版本軟件。

既然這么方便,那么我們來看一下它是怎么使用的吧。

安裝

目前這個(gè)軟件還不支持在windows系統(tǒng)上使用,暫時(shí)只支持在Linux和Unix上安裝。對(duì)于macOS,可以使用Homebrew來安裝,官方文檔上對(duì)應(yīng)的鏈接是:https://github.com/pyenv/pyenv#homebrew-on-macos
對(duì)于Linux/Unix用戶來說,有兩種安裝方式,第一種是根據(jù)官方文檔來一步步安裝,步驟如下:

  1. 克隆安裝軟件。命令是

    $ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
  2. 定義環(huán)境變量

    $ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
    $ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile

    對(duì)于使用zsh的用戶,需要把 ~/.bash_profile改成~/.zshrc。
    對(duì)于使用Ubuntu的用戶,需要把 ~/.bash_profile改成~/.bashrc

  3. 將pyenv init命令添加到shell里已啟用shims和自動(dòng)補(bǔ)全,shims是用于多版本Python選擇的工具,添加命令如下:

    $ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile

    對(duì)于使用zsh的用戶,需要把 ~/.bash_profile改成~/.zshrc。
    對(duì)于使用Ubuntu的用戶,需要把 ~/.bash_profile改成~/.bashrc

  4. 重啟shell讓配置的命令生效,可以退出shell重新登錄,也可以執(zhí)行命令:
    $ exec "$SHELL"

上面的安裝步驟看起來非常繁瑣對(duì)吧,官方也因此提供了一個(gè)一鍵安裝腳本,通過這個(gè)一鍵安裝腳本,上面的3個(gè)步驟都可以省略了,安裝腳本的命令是:

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

注意:需要提前安裝好git,因?yàn)樗彩窍韧ㄟ^git克隆到本地。

腳本執(zhí)行過程如下:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   148  100   148    0     0     20      0  0:00:07  0:00:07 --:--:--    39
100  2454  100  2454    0     0     94      0  0:00:26  0:00:26 --:--:--   668
Cloning into '/root/.pyenv'...
remote: Enumerating objects: 670, done.
remote: Counting objects: 100% (670/670), done.
remote: Compressing objects: 100% (503/503), done.
remote: Total 670 (delta 335), reused 255 (delta 76), pack-reused 0
Receiving objects: 100% (670/670), 380.59 KiB | 30.00 KiB/s, done.
Resolving deltas: 100% (335/335), done.
....
Cloning into '/root/.pyenv/plugins/pyenv-which-ext'...
remote: Enumerating objects: 10, done.
remote: Counting objects: 100% (10/10), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 10 (delta 1), reused 6 (delta 0), pack-reused 0
Unpacking objects: 100% (10/10), done.

這中間會(huì)克隆多個(gè)包,輸出信息比較長,內(nèi)容類似,所以這里省略了一部分。腳本執(zhí)行完畢以后,會(huì)提示你,沒有把pyenv添加到PATH路徑,然后你根據(jù)它的提示添加一下。提示內(nèi)容如下所示:

WARNING: seems you still have not added 'pyenv' to the load path.

# Load pyenv automatically by adding
# the following to ~/.bashrc:

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

我們需要執(zhí)行的操作是,打開~/.bashrc文件,把最下面三行添加進(jìn)去,添加好的~/.bashrc文件如下所示:

# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
export PATH="/root/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

保存退出,然后執(zhí)行一下命令:

source ~/.bashrc

讓配置生效。

使用

到這里,pyenv就已經(jīng)安裝好了。然后我們執(zhí)行命令pyenv versions

[root@adminnode ~]# pyenv versions 
* system (set by /root/.pyenv/version)

這個(gè)命令不是查看pyenv的版本的,而是查看當(dāng)前系統(tǒng)上安裝了哪幾個(gè)版本的Python,正常情況下剛安裝好只有一個(gè)system,對(duì)應(yīng)的是系統(tǒng)的python版本。例如CentOS7默認(rèn)是python2.7,而CentOS 8現(xiàn)在默認(rèn)是python3.6。

因此如果我們想使用其他版本的python作為虛擬環(huán)境的模板時(shí),就需要自己來安裝對(duì)應(yīng)的版本,比如現(xiàn)在Python的最新版本已經(jīng)到了3.8.2版本,我希望以這個(gè)版本來作為模板。那么我就需要安裝3.8.2。

安裝編譯python需要的依賴包
yum install -y gcc make patch gdbm-devel openssl-devel sqlite-devel \
readline-devel zlib-devel bzip2-devel  libffi-devel
下載python源碼包

這一步如果是在國內(nèi)的服務(wù)器或虛擬機(jī)上建議操作,因?yàn)槲覀冏约翰幌螺d的話,pyenv它默認(rèn)會(huì)到python.org的官網(wǎng)上去下載源碼包,因?yàn)椴煌貐^(qū)的網(wǎng)絡(luò)環(huán)境不一樣,可能會(huì)導(dǎo)致這一步特別慢,甚至?xí)苯邮?。因此我們推薦首先自己到python官網(wǎng)下載好源碼包。然后上傳到你的服務(wù)器上,然后拷貝到pyenv的緩存目錄中,如下所示:

[root@adminnode ~]# ls
anaconda-ks.cfg   Python-3.8.2.tar.xz
[root@adminnode ~]# mkdir ~/.pyenv/cache
[root@adminnode ~]# 
[root@adminnode ~]# cp Python-3.8.2.tar.xz ~/.pyenv/cache/

然后再執(zhí)行安裝命令的時(shí)候,它就會(huì)自動(dòng)使用緩存里的源碼包,這樣安裝速度就會(huì)比較快。

安裝
[root@adminnode ~]# pyenv install 3.8.2
Installing Python-3.8.2...
Installed Python-3.8.2 to /root/.pyenv/versions/3.8.2

耐心等待它安裝完成,這里安裝命令后面直接跟上python對(duì)應(yīng)的版本號(hào)即可。安裝完成后,所有版本的python都是安裝在/root/.pyenv/versions目錄下,如下所示:

[root@adminnode ~]# ls /root/.pyenv/versions/
3.8.2

然后我們?cè)俨榭匆呀?jīng)安裝的版本信息,就能夠看到新安裝的3.8.2,如下所示:

[root@adminnode ~]# pyenv versions
* system (set by /root/.pyenv/version)
  3.8.2
使用

既然模板搭建好了,那么我們現(xiàn)在就可以使用這個(gè)模板來創(chuàng)建我們需要的虛擬環(huán)境。在創(chuàng)建之前我們需要說幾個(gè)注意的點(diǎn):

  • 當(dāng)前模板中安裝了某個(gè)包,那么以這個(gè)模板創(chuàng)建的虛擬環(huán)境中就會(huì)有這個(gè)包。
  • 虛擬環(huán)境創(chuàng)建以后,模板中新安裝的包不會(huì)出現(xiàn)在虛擬環(huán)境中。也就是說虛擬環(huán)境一旦創(chuàng)建,虛擬環(huán)境和模板就是兩個(gè)完全隔離的環(huán)境了。

下面我們來看一個(gè)創(chuàng)建虛擬環(huán)境具體的例子,創(chuàng)建虛擬環(huán)境的命令基本格式是:

pyenv virtualenv  template_version   virtualenv_name

template_version指的是模板的版本號(hào),virutalenv_name指的是虛擬環(huán)境名詞,一般是你的項(xiàng)目的名稱。假設(shè)我們要開發(fā)一個(gè)cmdb項(xiàng)目,那么我們就來創(chuàng)建一個(gè)cmdb的虛擬環(huán)境,如下所示:

[root@adminnode ~]# pyenv virtualenv 3.8.2 cmdb
Looking in links: /tmp/tmp_42mjdiv
Requirement already satisfied: setuptools in /root/.pyenv/versions/3.8.2/envs/cmdb/lib/python3.8/site-packages (41.2.0)
Requirement already satisfied: pip in /root/.pyenv/versions/3.8.2/envs/cmdb/lib/python3.8/site-packages (19.2.3)
[root@adminnode ~]# pyenv versions
* system (set by /root/.pyenv/version)
  3.8.2
  3.8.2/envs/cmdb
  cmdb

這個(gè)時(shí)候就能看到創(chuàng)建好的虛擬環(huán)境名稱,但是也可以看到當(dāng)前目錄下的python版本還是system,那么怎么切換到cmdb版本呢?

pyenv是以目錄為單位來進(jìn)行版本控制的,比如說你單獨(dú)一個(gè)項(xiàng)目有一個(gè)項(xiàng)目目錄,我在項(xiàng)目目錄下設(shè)置好這個(gè)項(xiàng)目的python版本,那么項(xiàng)目的子目錄全部會(huì)自動(dòng)繼承這個(gè)配置。設(shè)置目錄的python版本命令是:

pyenv local virtualenv_name

示例如下:

[root@adminnode ~]# mkdir cmdb
[root@adminnode ~]# ls
anaconda-ks.cfg  cmdb  docker  Python-3.8.2.tar.xz
[root@adminnode ~]# cd cmdb
[root@adminnode cmdb]# pyenv local cmdb
(cmdb) [root@adminnode cmdb]# 

在上面的代碼中我們可以看到,切換到項(xiàng)目cmdb目錄下以后,設(shè)置該目錄的虛擬環(huán)境為cmdb,然后我們從shell的提示符中可以看到,前面多了一個(gè)(cmdb)的提示,表示我們進(jìn)入到虛擬環(huán)境了,也就是說這個(gè)時(shí)候就是一個(gè)獨(dú)立的python開發(fā)環(huán)境。我們看一下這個(gè)目錄的內(nèi)容,如下所示:

(cmdb) [root@adminnode cmdb]# ls -al 
total 8
drwxr-xr-x. 2 root root   29 Mar  3 11:29 .
dr-xr-x---. 9 root root 4096 Mar  3 11:24 ..
-rw-r--r--. 1 root root    5 Mar  3 11:29 .python-version
(cmdb) [root@adminnode cmdb]# cat .python-version 
cmdb

可以看到多了一個(gè)隱藏文件.python-version,文件內(nèi)容是cmdb,也就是說pyenv是通過這個(gè)文件來控制當(dāng)前目錄下的虛擬環(huán)境。

  1. 虛擬環(huán)境的刪除

當(dāng)開發(fā)項(xiàng)目越來越多以后,可能虛擬環(huán)境的信息也會(huì)越來越多,因此就需要?jiǎng)h除一些不再使用的虛擬環(huán)境,這個(gè)時(shí)候就需要用到刪除命令,如下所示:

pyenv virtualenv-delete virtualenv_name

但是刪除之前,建議你通過虛擬環(huán)境的pip命令導(dǎo)出虛擬環(huán)境下的包列表,命令是:

pip freeze --all  > requirements.txt

將已安裝的包導(dǎo)出到requirements.txt文件中,然后再刪除這個(gè)虛擬環(huán)境:

(cmdb) [root@adminnode cmdb]# pyenv virtualenv-delete cmdb
pyenv-virtualenv: remove /root/.pyenv/versions/3.8.2/envs/cmdb? y
[root@adminnode cmdb]# ls -al 
total 12
drwxr-xr-x. 2 root root   53 Mar  3 11:41 .
dr-xr-x---. 9 root root 4096 Mar  3 11:24 ..
-rw-r--r--. 1 root root    5 Mar  3 11:29 .python-version
-rw-r--r--. 1 root root   31 Mar  3 11:41 requirements.txt
[root@adminnode cmdb]# cat .python-version 
cmdb

刪除完成后,當(dāng)前目錄下的.python-version文件還存在,但是因?yàn)檎也坏綄?duì)應(yīng)的虛擬環(huán)境信息,此時(shí)就無法生效。

看完上述內(nèi)容,你們對(duì)python中pyenv虛擬環(huán)境管理工具的使用方法大概了解了嗎?如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI