2020-02-22python高手之路學(xué)習(xí)隨筆(7)

第七章虛擬環(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í)。 而libinclude,僅僅是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)境里的pythonpip等,包括后來(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)該有更大的用處吧。。。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容