virtualenv虛擬環境的使用

我們在開發項目時,如果直接在本機上安裝Python包進行項目開發,所有項目會共用同一個Python, 它有一些缺點:
(1)修改這個用戶的庫可能影響你的系統上的其它Python 軟件。
(2)你將不可以運行這個包的多個版本(或者具有相同名字的其它包)。

特別是一旦你維護幾個項目,這些情況就會出現。 如果確實出現,最好的解決辦法是使用virtualenv。 這個工具允許你維護多個分離的Python環境,每個都具有它自己的庫和包的命名空間。這種情況下,每個應用可能需要各自擁有一套“獨立”的Python運行環境。virtualenv就是用來為一個應用創建一套“隔離”的Python運行環境。


1、我們用pip安裝virtualenv:

PS C:\Users\Cheng> pip3 install virtualenv

2、進入我們安放項目的目錄,新建一個應用,配置一套獨立的Python環境:

首先,新建一個應用目錄,進入該目錄。

PS C:\Users\Cheng> cd .\MyPythonProjects\
PS C:\Users\Cheng\MyPythonProjects> mkdir Django-Pointsite
PS C:\Users\Cheng\MyPythonProjects> cd .\Django-Pointsite\
PS C:\Users\Cheng\MyPythonProjects\Django-Pointsite>

然后,創建一個獨立Python環境,如果virtualenv版本大于20,virtualenv默認--no-site-packages這個參數,就執行virtualenv venv

PS C:\Users\Cheng\MyPythonProjects\Django-Pointsite> virtualenv --no-site-packages venv
Usingbase prefix '/usr/local/.../Python.framework/Versions/3.6'
New python executable in venv/bin/python3.6
Alsocreating executable in venv/bin/python
Installing setuptools, pip, wheel...done.

命令virtualenv就可以創建一個獨立的Python運行環境,我們還加上了參數--no-site-packages,這樣,已經安裝到系統Python環境中的所有第三方包都不會復制過來,這樣,我們就得到了一個不帶任何第三方包的“干凈”的Python運行環境。新建的Python環境被放到當前目錄下的venv目錄,有了venv這個Python環境。


這里要注意一下系統區別,MacOS、Linux可以用source進入該環境:

source venv/bin/activate

但是在Windows系統中,則是通過.\venv\Scripts\activate命令進入虛擬環境,因為運行了activate.bat后會在同級目錄下生成activate.ps1,PowerShell 默認不允許執行*.ps1腳本文件。運行ps1文件會得到下面的錯誤:

.\venv\Scripts\activate : 無法加載文件 venv\Scripts\activate.ps1,因為在此系統上禁止運行腳本。有關詳細信息,請參閱 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
所在位置 行:1 字符: 1+ 
.\venv\Scripts\activate
+ ~~~~~~~~~~~~~~~~~~~~~~~    
+CategoryInfo          : SecurityError:(:) [],PSSecurityException
+FullyQualifiedErrorId : UnauthorizedAccess

所以要解決這個問題,需要在powershell里面修改policy:

PS C:\Users\Cheng\MyPythonProjects\Django-Pointsite> .\venv\Scripts\activate.bat
PS C:\Users\Cheng\MyPythonProjects\Django-Pointsite> Set-ExecutionPolicy RemoteSigned 
執行策略更改執行策略可幫助你防止執行不信任的腳本。更改執行策略可能會產生安全風險,如 https:/go.microsoft.com/fwlink/?LinkID=135170 中的about_Execution_Policies 幫助主題所述。是否要更改執行策略?
[Y] 是(Y)  [A] 全是(A)  [N] 否(N)  [L] 全否(L)  [S] 暫停(S)  [?] 幫助 (默認值為“N”):  Y
PS C:\Users\Cheng\MyPythonProjects\Django-Pointsite> .\venv\Scripts\activate.bat
PS C:\Users\Cheng\MyPythonProjects\Django-Pointsite> .\venv\Scripts\activate
(venv) PS C:\Users\Cheng\MyPythonProjects\Django-Pointsite> 

Policy的有效參數:
-- Restricted: 不載入任何配置文件,不運行任何腳本。 "Restricted" 是默認的。
-- AllSigned: 只有被Trusted publisher簽名的腳本或者配置文件才能使用,包括你自己再本地寫的腳本。
-- RemoteSigned: 對于從Internet上下載的腳本或者配置文件,只有被Trusted,publisher簽名的才能使用。
-- Unrestricted: 可以載入所有配置文件,可以運行所有腳本文件. 如果你運行一個從internet下載并且沒有簽名的腳本,在運行之前,你會被提示需要一定的權限。
-- Bypass: 所有東西都可以使用,并且沒有提示和警告。
-- Undefined: 刪除當前scope被賦予的ExecutionPolicy,但是Group Policy scope的Execution Policy不會被刪除。


注意到命令提示符變了,有個(venv)前綴,表示當前環境是一個名為venv的Python環境。在venv環境下,用pip安裝的包都被安裝到venv這個環境下,系統Python環境不受任何影響。也就是說,venv環境是專門針對Django-Pointsite這個應用創建的。
退出當前的venv環境,使用deactivate命令:

(venv) PS C:\Users\Cheng\MyPythonProjects\Django-Pointsite> deactivate
PS C:\Users\Cheng\MyPythonProjects\Django-Pointsite>

virtualenv為應用提供了隔離的Python運行環境,解決了不同應用間多版本的沖突問題。

參考文章:廖雪峰的官方網站

如果你喜歡本文章,還請點個關注和喜歡,我會為大家不斷地帶來Python學習筆記。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容