博客 / 詳情

返回

Virtualenv、pipenv、conda虛擬環境設置方法及原理

1.為什麼要創建虛擬環境

我第一次接觸虛擬環境時第一感覺就是牴觸,相信剛開始被各種配置折磨過的小夥伴能理解,我就想是否可以不用虛擬環境,就查了下推薦使用虛擬環境的理由:

(1)所有的項目的庫都放到一個地方容易混亂,而且比較冗餘,畢竟不是所有的項目都需要那麼多的庫(這一點我根本就不關心嘛,少一步配置就少被折磨一次)

(2)因為工作以後都是分工協作的,這個項目能在你電腦上運行,但是到了別人那如果沒有安裝相應的庫就無法運行,所以需要大家能夠在庫上進行同步(就是一個庫同步嘛,可以手動整理一個庫列表就可以啦,為了少一步配置也是拼了)

(3)不同的項目對同一個庫版本要求不一樣,如果A項目要求一個庫的版本低,B項目的要求同一個庫版本高,運行B項目升級了這個庫覆蓋前一個版本,就會導致A項目無法運行(這倒是一個比較充足的理由,看樣子非得要配置虛擬環境了)

2.配置虛擬環境(windows)

以下虛擬變量只針對python3,python2過時了就不説了。

使用Virtualenv配置虛擬環境

隨便找一個目錄新建一個文件夾,在此文件夾內打開命令提示符,輸入下面命令:

python -m venv venv

虛擬環境就創建完成了,需要注意的點:

有的命令會説python3 -m venv venv,其實第一個python或者python3就是在命令行裏運行python的命令,前提是你的python添加到了系統環境變量了。

所以你需要在命令行試一下

Uka0aD.png

像我這邊使用python和py -3能正常使用python shell,所以我這邊使用

python -m venv venv
py -3 -m venv venv

都可以創建虛擬環境,有的人同時裝了python2.7和python3.7或其他python3版本,如果默認python是2.7那麼就使用py -3 -m venv venv就可以了。一定要試一下,下面的python shell顯示的是python3版本的才可以了。因為venv是python3新增的虛擬環境設置方法。

我在D:\GitHub\git倉庫\test運行上面命令後就在此文件夾下創建了一個venv的文件夾,所以呢,這個命令行的最後一個venv是可以自定義的,比如

python -m venv hello

然後就在test文件夾下創建了一個hello文件夾,文件夾裏面就是解釋器和需要的庫文件夾。

UkBlO1.png

如果使用

python -m venv .

後面使用點號,那麼虛擬環境就會創建在test文件夾下,而不是在test文件夾下新建一個文件夾來創建虛擬環境。

激活虛擬環境:

首先我們需要進入到虛擬環境的Scripts文件夾下,然後輸入activate

UkwRUS.png

虛擬環境前面會有一個小括號的標記,激活虛擬環境後再用pip安裝包時就會安裝到此虛擬環境中,而不是系統環境中了。

退出虛擬環境的命令:deactivate,目錄對是不是Scripts沒有要求。但是激活虛擬環境必須在Scripts環境中。

複製或者導出虛擬環境

在虛擬環境內輸入:

pip freeze > requirements.txt

注意,這個在哪個目下輸入,requirements.txt文件就在當前目錄生成,包含庫和對應的版本號,每運行一次,會覆蓋上一次生成的文件。

Ukrri8.png

新建一個項目,創建並激活虛擬環境,把上面的requirements.txt文件複製到Scripts文件夾下,輸入:

pip install -r requirements.txt

然後就把上一個項目的庫導入到這個項目中來了。這樣的好處是大家用的是相同版本號的庫,不會出現項目不兼容的情況。

使用pipenv配置虛擬環境

我還是用D:\GitHub\git倉庫\test這個目錄,順便説一下刪除虛擬環境,把虛擬環境文件夾直接刪除就可以了,這樣也比較方便。

因為pipenv不是python自帶的,所以我們需要先安裝這個庫,因為經常用就全局安裝

pip install pipenv
在Linux或macOS中全局安裝
sudo pip install pipenv

創建虛擬環境

pipenv install

默認情況下pipenv會同一管理所有的虛擬環境。在Windows中,虛擬環境文件夾會在C:\Users\你的用户名文件.virtualenvs

文件夾下,

Uk6UsJ.png

記不住目錄沒有關係,命令行裏會有提示

Ukc7A1.png

但是我並不想把虛擬環境放到C盤目錄下,想把虛擬環境放到項目文件夾下,有兩種方法:

在使用pipenv install之前先在項目文件夾下創建一個文件.venv,然後再運行pipenv install就可以了;

另一種方法,先在命令行下配置環境變量

PIPENV_VENV_IN_PROJECT=True

意思是pipenv的虛擬環境在項目裏,然後再隱形pipenv install創建環境變量,這樣就在項目文件夾下創建了虛擬環境文件夾。虛擬環境跟着項目走,比較方便。

有個小插曲:我看到上面的圖片上創建虛擬環境的解釋器是用的anaconda的python3.7.6,我一直理解是通過系統變量裏的python3版本創建,因為我沒有把anaconda的python3添加到環境變量,出了這個情況我就檢查了下原因,新建了一個文件夾並創建虛擬環境發現又回到python3.8,也就是添加到環境變量的那個python,不是集成anaconda裏的python,想起是因為test文件夾剛才試過用conda的虛擬環境導致的問題。所以,我的理解沒啥問題,還是默認用python3且是系統變量裏的那個版本。

在當前文件夾下創建虛擬環境文件夾的同時,還創建了兩個文件Pipfle和Pipfile.lock,這兩個文件用於管理依賴。作用等同與上一個方法中的requirements.txt,不過好處是不許要手動維護,在安裝python庫時會自動更新兩個文件。前者用來記錄項目依賴包列表,而後者記錄了固定版本的詳細依賴包列表。當我們使用pipenv 安裝/刪除/更新依賴包時,二者自動更新。

所以要記得,這裏安裝包用pipenv命令。由於官方源比較慢,所以記得安裝包時提前打開Pipfile更換國內源,把原來的地址替換為國內源地址即可

Uk4OIJ.png

我這個是替換為清華的,其他的也一樣。原地址為https://pypi.org/simple,會比較慢。

然後運行pipenv安裝庫,例如

pipenv install flask

上面的圖已經安裝了flask,在[packages]下面就顯示了flask,[dev-packages]下的是隻用於開發環境的包,安裝時在後面加”--dev"即可

pipenv install watchdog --dev

這裏只顯示了包列表,沒有顯示具體版本信息,這些內容在Pipfile.lock文件內顯示

UkILC9.png

運行pipenv install時,會檢測當前文件夾下有沒有這兩個文件,如果有的話,就創建虛擬環境並安裝Pipfile裏的包,就如同上個方法用pip install -r requirements.txt命令一樣。如果沒有則創建者兩個文件。這兩個文件上傳git時需要記得傳上去。

激活虛擬環境

可以用pipenv shell命令顯示的激活虛擬環境,而且不需要進入scripts文件即可激活虛擬環境

UkHTMR.png

退出用exit命令。

除了顯示地激活虛擬環境,Pipenv還提供了一個pipenv run命令,這個命令允許不顯示激活虛擬環境即可在當前項目的虛擬環境中執行命令,比如:

pipenv run python app.py

這會使用當前項目虛擬環境中的python解釋器,而不是全局的python解釋器。這個命令可以讓你不用關心自己是否忘記激活虛擬環境的問題。相比上一個方法必須激活才能運行要方便的多。同時pipenv install numpy這種安裝包的命令也可以忽略是否激活了虛擬環境。

總體上來講,pipenv從管理依賴、激活虛擬環境和運行命令方面要比上一個方法方便。推薦大家使用。

使用conda創建虛擬環境

首先打開Anaconda Prompt,這個與cmd命令行類似,打開之後直接是運行了anaconda基礎的虛擬環境。

UkLjiT.png

打開之後

UkO9y9.png

這就算打開了anaconda自帶的base虛擬環境。cmd也可以運行這個,只不過麻煩一點,先找到anaconda安裝目錄,找到Scripts文件夾,運行activate激活虛擬環境就進入anaconda了,下面是用cmd命令行打開的

UkO26J.png

用conda創建虛擬環境不需要提前創建文件夾什麼的,因為conda專門在anaconda文件下指定了一個虛擬環境的目錄envs,直接運行下面命令即可創建虛擬環境

conda create -n python37

conda create -n python37 python=3.7
或者
conda create -name python37 python=3.7

第一個沒有指定python版本,後面兩個指定了python版本。這是conda與上面兩個稍微不同的地方,也許上面連個也能指定,但是暫時不清楚,畢竟anaconda可以同時存在python3.5,python3.6,python3.7,python3.8等,但是上面兩個應該不行。

運行完命令後可以在envs下面看到新建的虛擬環境文件夾。

UkXO8U.png

name後面的就是虛擬環境的名字,文件夾內對應出現python37文件夾。

虛擬環境創建完成需要切換環境,用activate 環境名

activate python37

如果忘記了可以用conda env list查看虛擬環境列表

UASQmQ.png

進入虛擬環境之後就可以用conda安裝包了,推薦用conda,比pip要好用一點。導出上第一個方法一樣

pip freeze > requirements.txt

這有個問題就是虛擬環境時固定在anaconda安裝包裏的,把項目創建者anaconda安裝包裏的情況應該是不常見的,所以在別的地方創建了項目,需要把解釋器指定到這個虛擬環境裏,用pycharm為例,打開File>Settings>Project:test>Python Interpreter

點擊右側設置,選擇show all

UAp5KU.png如果是第一次點擊右側加號添加這個虛擬環境,如果已經有了從列表中選擇即可

UApIrF.png選擇已經存在的環境,點擊右側按鈕進入目錄選擇

UAphvT.png這裏要注意一下,上面兩個的python.exe都是在Scripts文件夾中,conda的就是在根目錄中

UApf2V.png

設置完就可以使用anaconda創建的虛擬環境了。

3.虛擬環境原理

説到虛擬環境,是與python實際的環境對應的,虛擬環境就是python實際環境的一個副本,不過是一個簡化版的副本。那虛擬環境到底做了些什麼呢,其實也很簡單,我們可以對比一下path環境變量

UAen1J.png

上面的是激活了虛擬環境的環境變量,下面的是沒有激活虛擬環境的系統環境變量,仔細對比一下就是虛擬環境在系統環境變量前插入了一個變量,截胡了。因為誰在前面運行誰,所以在虛擬環境中運行的python就都是虛擬環境中設置的python了。取消激活虛擬環境後,系統的環境變量就恢復成下面的樣子了。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.