最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python 虛擬環(huán)境工作原理解析

 更新時(shí)間:2020年12月24日 09:55:37   作者:悟空小飯  
這篇文章主要介紹了Python 虛擬環(huán)境工作原理解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

Python 的虛擬環(huán)境用來(lái)創(chuàng)建一個(gè)相對(duì)獨(dú)立的執(zhí)行環(huán)境,尤其是一些依賴的三方包,最常見(jiàn)的如不同項(xiàng)目依賴同一個(gè)但是不同版本的三方包,而且,在虛擬環(huán)境中的安裝包不會(huì)影響到系統(tǒng)的安裝包。

不過(guò),其具體的工作原理是怎樣的,這里詳細(xì)介紹。

簡(jiǎn)介

幾乎每個(gè)語(yǔ)言都包含自己的包管理工具,這是一個(gè)非常復(fù)雜的話題,而不同語(yǔ)言選擇的實(shí)現(xiàn)又略有區(qū)別,都會(huì)做一些選擇和取舍。而 Python 的包管理解決方案很多,例如 pip、virtualenv、pyenv 等等。

不過(guò) Python 語(yǔ)言本身的機(jī)制決定了其原理一樣。

使用

比較常用的是 virtualenv 工具,可以參考 Guide to Python 中的詳細(xì)介紹,另外,Python3 也提供了自己的虛擬環(huán)境創(chuàng)建模塊,在創(chuàng)建完成后基本都是通過(guò)一個(gè)腳本啟用獨(dú)立環(huán)境。

例如,如下是使用 virtualenv 以及 venv 的虛擬環(huán)境創(chuàng)建過(guò)程。

$ mkdir /tmp/project && cd /tmp/project

$ virtualenv --no-site-packages foobar
$ python3 -m venv foobar

然后,就可以通過(guò) source foobar/bin/activate 命令激活新環(huán)境。

激活腳本

所謂的獨(dú)立環(huán)境,無(wú)非就是解決兩個(gè)問(wèn)題:A) 執(zhí)行 Python 解析器所使用的版本;B) 使用獨(dú)立的包。其中前者,在 Linux 主要是通過(guò) PATH 環(huán)境變量設(shè)置,在 activate 腳本中有如下的內(nèi)容。

VIRTUAL_ENV="/tmp/project/foobar"
export VIRTUAL_ENV

_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH

也就是將創(chuàng)建的目錄添加到 PATH 環(huán)境變量最開(kāi)始,那么就會(huì)優(yōu)先查找該路徑,這樣就解決了 python 解析器獨(dú)立的問(wèn)題。

工作原理

如果要使用獨(dú)立的包,那么關(guān)鍵就是如何在通過(guò) import 導(dǎo)入時(shí)查找到所需的包。

包的查找順序可以查看Python 模塊簡(jiǎn)介 中的介紹,簡(jiǎn)單來(lái)說(shuō),就是先查看是否是內(nèi)置模塊,然后再?gòu)?sys.path 列表指定的地址中搜索。所以,這里的關(guān)鍵就是 sys.path 列表的生成。

關(guān)于 sys.prefix

在 Python 啟動(dòng)的時(shí)候,會(huì)先加載一個(gè)強(qiáng)依賴的 os.py 包,而查找這個(gè)包是根據(jù)解析器的當(dāng)前路徑,以及固定的查找規(guī)則來(lái)實(shí)現(xiàn)的。

簡(jiǎn)單來(lái)說(shuō),就是在當(dāng)前路徑加上 lib/python${VERSION}/os.py 逐層向上查找,注意,如果是 64 位的操作系統(tǒng),那么會(huì)使用 lib64 替換掉之前的 lib 路徑。

例如,默認(rèn)的 Python3 的解析器路徑為 /usr/bin/python3.6 ,那么基礎(chǔ)路徑是 /usr/bin/ ,所以,其查找順序?yàn)椤?/p>

/usr/bin/lib64/python3.6/os.py
/usr/lib64/python3.6/os.py
/lib64/python3.6/os.py

只要在任意路徑上找到 os.py 包,那么就會(huì)退出查找,并設(shè)置好 sys.prefix 變量,詳細(xì)可以通過(guò) strace python 查看,會(huì)有如下的搜索路徑。

stat("/usr/bin/Modules/Setup", 0x7fffb7146300) = -1 ENOENT (No such file or directory)
stat("/usr/bin/lib64/python2.7/os.py", 0x7fffb71462f0) = -1 ENOENT (No such file or directory)
stat("/usr/bin/lib64/python2.7/os.pyc", 0x7fffb71462f0) = -1 ENOENT (No such file or directory)
stat("/usr/lib64/python2.7/os.py", {st_mode=S_IFREG|0644, st_size=25910, ...}) = 0

在查找到 os.py 之后,會(huì)將該路徑設(shè)置為 sys.prefix 變量,然后解析器就會(huì)到 ${sys.prefix}/lib/python${VERSION} 目錄下查找包。

總結(jié)

那么其工作原理就是,將 python 解析器保存在 ${VENV_PATH}/bin/python ,然后創(chuàng)建 ${VENV_PATH}/lib/python${VERSION} 目錄,并將相關(guān)的文件復(fù)制到該目錄下,可以復(fù)制文件,也可以使用軟連接。

其它

如上,如果是 Python3 就可以直接使用內(nèi)置的 venv 模塊,其原理與上述的相同,同時(shí)通過(guò) pyvenv.cfg 配置文件來(lái)標(biāo)識(shí)原始的 home 位置,該文件的內(nèi)容如下。

home = /usr/bin
include-system-site-packages = false
version = 3.6.8

如果 include-system-site-packagestrue ,解釋器啟動(dòng)時(shí)就會(huì)將系統(tǒng)的庫(kù)添加到 sys.path 里面,這樣在虛擬環(huán)境就可以 import 系統(tǒng)中安裝的包了。

注意,Python3 提供的 venv 模塊只能根據(jù)當(dāng)前版本創(chuàng)建,不能支持 Python2 。

參考 Virtualenv 官方文檔,細(xì)節(jié)可以參考該文檔。

Creation of virtual environments Python3 提供的 venv 介紹,包括常見(jiàn)參數(shù)以及配置文件。

 

← Older

到此這篇關(guān)于Python 虛擬環(huán)境工作原理解析的文章就介紹到這了,更多相關(guān)Python 虛擬環(huán)境原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python使用epoll實(shí)現(xiàn)服務(wù)端的方法

    python使用epoll實(shí)現(xiàn)服務(wù)端的方法

    今天小編就為大家分享一篇python使用epoll實(shí)現(xiàn)服務(wù)端的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • Python函數(shù)命名空間,作用域LEGB及Global詳析

    Python函數(shù)命名空間,作用域LEGB及Global詳析

    這篇文章主要介紹了Python函數(shù)命名空間,作用域LEGB及Global詳析,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-09-09
  • 我的快遞一個(gè)月沒(méi)動(dòng)靜于是趕緊上線python快遞查詢系統(tǒng)

    我的快遞一個(gè)月沒(méi)動(dòng)靜于是趕緊上線python快遞查詢系統(tǒng)

    我的快遞在路上走了一個(gè)月還沒(méi)到,于是自己編寫(xiě)快遞查詢,文中通過(guò)實(shí)例代碼截圖的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-09-09
  • Python 正則表達(dá)式 re . 符號(hào)示例詳解

    Python 正則表達(dá)式 re . 符號(hào)示例詳解

    (點(diǎn)號(hào)) 在默認(rèn)模式下,匹配除換行符以外的任意字符, 如果指定了 flags 參數(shù) DOTALL ,它將匹配包括換行符在內(nèi)的任意字符,下面通過(guò)示例代碼介紹Python 正則表達(dá)式 re . 符號(hào),感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • python實(shí)現(xiàn)IOU計(jì)算案例

    python實(shí)現(xiàn)IOU計(jì)算案例

    這篇文章主要介紹了python實(shí)現(xiàn)IOU計(jì)算案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • 利用PyQt中的QThread類實(shí)現(xiàn)多線程

    利用PyQt中的QThread類實(shí)現(xiàn)多線程

    本文主要給大家分享的是python實(shí)現(xiàn)多線程及線程間通信的簡(jiǎn)單方法,非常的實(shí)用,有需要的小伙伴可以參考下
    2020-02-02
  • Numpy的簡(jiǎn)單用法小結(jié)

    Numpy的簡(jiǎn)單用法小結(jié)

    這篇文章主要介紹了Numpy的簡(jiǎn)單用法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Python實(shí)現(xiàn)批量替換Excel中字符

    Python實(shí)現(xiàn)批量替換Excel中字符

    這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)批量替換Excel中字符,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • python輕松查到刪除自己的微信好友

    python輕松查到刪除自己的微信好友

    這篇文章主要介紹了python腳本快速查看自己被多少微信好友刪除的方法,感興趣的小伙伴們可以參考一下
    2016-01-01
  • python基礎(chǔ)之內(nèi)置函數(shù)

    python基礎(chǔ)之內(nèi)置函數(shù)

    這篇文章主要介紹了python內(nèi)置函數(shù),實(shí)例分析了Python中返回一個(gè)返回值與多個(gè)返回值的方法,需要的朋友可以參考下
    2021-10-10

最新評(píng)論

灵武市| 萍乡市| 临高县| 大足县| 铜山县| 浦江县| 砚山县| 土默特左旗| 西安市| 米脂县| 安陆市| 扶绥县| 汕尾市| 额尔古纳市| 越西县| 莲花县| 贵定县| 濉溪县| 黔西县| 工布江达县| 永康市| 舟山市| 瑞昌市| 东丰县| 南丹县| 甘泉县| 高安市| 襄城县| 黑水县| 江北区| 浙江省| 肥城市| 扶风县| 江陵县| 乌恰县| 元谋县| 抚州市| 綦江县| 江源县| 青川县| 林州市|