第七章虛擬環(huán)境
介于第六章的分發(fā) 過(guò)于復(fù)雜,先學(xué)了第七章吧。
與Python打交道免不了需要很多依賴的問(wèn)題,如:
1 系統(tǒng)中沒(méi)有需要的庫(kù)
2系統(tǒng)中沒(méi)有需要的庫(kù)的正確版本
3 對(duì)兩個(gè)不同的應(yīng)用程序可能需要同一個(gè)庫(kù)的兩個(gè)不同版本。
這里書上分為了2種虛擬環(huán)境一種是第三方的庫(kù):virtualenv 另一種是venv,自帶的。
因?yàn)関env建立的環(huán)境不會(huì)自帶pip,跟setuptools ,所以我主要學(xué)習(xí)另一個(gè)virtualenv
1 安裝虛擬環(huán)境庫(kù)
pip install virtualenv
結(jié)果卡在這里好久,才發(fā)現(xiàn)環(huán)境庫(kù)版本太高,配不上python3.37版本
這里應(yīng)該
pip install virtualenv==16.4.3
2 創(chuàng)建虛擬環(huán)境庫(kù)(名字隨意)
virtualenv venv
3進(jìn)入環(huán)境
liunx 版本的
source venv/bin/activate
windows 版本的就只能是通過(guò)路徑直接啟動(dòng)了
C:\Users\Administrator\PycharmProjects\多線程練習(xí)
\venv\Scripts\activate
4退出環(huán)境
deactivate
另一個(gè)環(huán)境命令
創(chuàng)建環(huán)境
python -m venv myvenv
其他的跟上面的一樣
結(jié)論,到3.7版本之后二者其實(shí)沒(méi)多大區(qū)別了,甚至以為python跟庫(kù)的版本不匹配,virtualenv 居然沒(méi)有venv這個(gè)內(nèi)置庫(kù)好用,這是萬(wàn)萬(wàn)沒(méi)想到的。
到此高手之路第七章學(xué)習(xí)完畢。
深入思考,參考其他資料,留待以后,下面的東西未來(lái)我應(yīng)該用得到吧。
感興趣的可以看下去,不感興趣的可以過(guò),跟高手之路關(guān)系不大了。
虛擬環(huán)境原理
1改變當(dāng)前Shell的PATH。
2改變Python運(yùn)行時(shí)的sys.path。
這里的PATH應(yīng)該指的是系統(tǒng)path全局路徑,這里臨時(shí)修改成了第一項(xiàng)為本目錄下的python晨曦
,而這里的sys,path修改,則指的是修改替換了sys.path里面的路徑為虛擬環(huán)境路面的路徑
以下為python:alpine鏡像中,以root用戶演示的例子。
改變PATH
首先看一下它的目錄結(jié)構(gòu):
# ls venv
bin include lib
# ls /usr/local
bin include lib share
環(huán)境內(nèi)所有的新內(nèi)容,都在這個(gè)新生成目錄下。 bin是可執(zhí)行文件的位置,include是C/C++的頭文件位置,lib是庫(kù)文件位置。 它和/usr/local內(nèi)的主要目錄幾乎相同,也和~/.local下類似。
魔法都在兩個(gè)PATH中。
# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# . venv/bin/activate
(venv) # echo $PATH
/root/venv/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
顯然,這個(gè)activate,為當(dāng)前PATH增加了venv/bin這個(gè)位置在最前方,因此虛擬環(huán)境中的可執(zhí)行文件擁有最高優(yōu)先級(jí)。 而lib與include,僅僅是bin下面的可執(zhí)行文件做相對(duì)路徑運(yùn)算來(lái)尋找的位置。 所以,改變了PATH,就改變了很多事。
# ls -hl venv/bin/
total 88
-rw-r--r-- 1 root root 2.0K Mar 31 08:06 activate
-rw-r--r-- 1 root root 1.1K Mar 31 08:06 activate.csh
-rw-r--r-- 1 root root 3.0K Mar 31 08:06 activate.fish
-rw-r--r-- 1 root root 1.5K Mar 31 08:06 activate.ps1
-rw-r--r-- 1 root root 986 Mar 31 08:06 activate.xsh
-rw-r--r-- 1 root root 1.5K Mar 31 08:06 activate_this.py
-rwxr-xr-x 1 root root 238 Mar 31 08:06 easy_install
-rwxr-xr-x 1 root root 238 Mar 31 08:06 easy_install-3.7
-rwxr-xr-x 1 root root 220 Mar 31 08:06 pip
-rwxr-xr-x 1 root root 220 Mar 31 08:06 pip3
-rwxr-xr-x 1 root root 220 Mar 31 08:06 pip3.7
-rwxr-xr-x 1 root root 35.8K Mar 31 08:06 python
-rwxr-xr-x 1 root root 2.3K Mar 31 08:06 python-config
lrwxrwxrwx 1 root root 6 Mar 31 08:06 python3 -> python
lrwxrwxrwx 1 root root 6 Mar 31 08:06 python3.7 -> python
-rwxr-xr-x 1 root root 216 Mar 31 08:06 wheel
由于優(yōu)先級(jí)最高,所以環(huán)境里的python、pip等,包括后來(lái)用pip安裝的可執(zhí)行文件,都使用的是venv下的。
改變sys.path
(venv) # python -m site
sys.path = [
'/root',
'/root/venv/lib/python37.zip',
'/root/venv/lib/python3.7',
'/root/venv/lib/python3.7/lib-dynload',
'/usr/local/lib/python3.7',
'/root/venv/lib/python3.7/site-packages',
]
USER_BASE: '/root/.local' (doesn't exist)
USER_SITE: '/root/.local/lib/python3.7/site-packages' (doesn't exist)
ENABLE_USER_SITE: False
(venv) # deactivate
# python -m site
sys.path = [
'/root',
'/usr/local/lib/python37.zip',
'/usr/local/lib/python3.7',
'/usr/local/lib/python3.7/lib-dynload',
'/usr/local/lib/python3.7/site-packages',
]
USER_BASE: '/root/.local' (doesn't exist)
USER_SITE: '/root/.local/lib/python3.7/site-packages' (doesn't exist)
ENABLE_USER_SITE: True
可見,sys.path發(fā)生了翻天覆地的變化。 除了當(dāng)前路徑/root和標(biāo)準(zhǔn)庫(kù)/usr/local/lib/python3.7被保留以外,其它位置都換成了venv下的。 這就是為什么pip list看不見什么軟件包的原因,也是環(huán)境隔離的最大秘密。
這玩意應(yīng)該有更大的用處吧。。。