Python - 虛擬環境 venv

小菠蘿測試筆記 發表於 2021-09-14
Python

什麼是虛擬環境

  • 這是 Python 3.3 的新特性:https://www.python.org/dev/peps/pep-0405/
  • 假設自己電腦主機的 Python 環境稱為系統環境,而預設情況下,虛擬環境和系統環境是完全隔離的
  • 每個系統環境下可以有多個虛擬環境
  • 每個虛擬環境都有自己的 Python 二進位制檔案及單獨的包安裝目錄,可以在虛擬環境中安裝屬於自己的 Python 包,而系統環境、其他虛擬環境並不會擁有這些 Python 包

 

一句話總結

Python 虛擬環境主要是為不同 Python 專案建立一個隔離的環境,每個專案都可以擁有獨立的依賴包環境,而專案間的依賴包互不影響

 

為什麼要虛擬環境

說下背景

  • 假設一個電腦包含多個 Python 專案
  • 每個專案所需的 Python 版本不一致,比如:Python 2.X、Python 3.X
  • 每個專案所需的依賴包不一致,比如 A 專案只要 Selenium 相關依賴包,B 專案只要 Appium 相關依賴包
  • 不同專案用同一個依賴包,但依賴包版本可能不一致

假設現在不用虛擬環境會有什麼問題?

 

瞭解下第三方庫的安裝目錄

預設情況下,Python 第三方庫都是裝在系統固定目錄的,比如 Mac 電腦

>>> import site
>>> site.getsitepackages()
['/usr/local/Cellar/[email protected]/3.9.5/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages']

電腦上所有專案都會從這個目錄去儲存、查詢第三方庫(站點庫)

 

帶來的問題

  • 不同專案使用同一個依賴包,但使用不同版本的依賴包時,意味著當開發 A 專案的時候,要裝一次依賴包 A 版本,轉開發 B 專案時,先要解除安裝依賴包 A 版本,再重灌 B 版本...
  • 一個環境下要安裝所有專案需要的依賴包,所以當某個專案需要生成 requirement.txt 的時候,會帶上很多用不上的依賴包,要刪還得手工一個個刪....

 

通過 venv 操作虛擬環境

Python 3.5 後推薦使用 venv 來建立虛擬環境

 

建立虛擬環境

python3 -m venv fastapi_test

fastapi_test 是虛擬環境名字,可以自定義

 

啟用虛擬環境

source <環境名稱>/bin/activate 

Python - 虛擬環境 venv

可以看到虛擬環境中的 Package 只有最基礎的 pip、setuptools

 

關閉虛擬環境

deactivate

 

Pycharm 專案關聯新建立的虛擬環境

Python - 虛擬環境 venv

先在專案目錄下建立好虛擬環境

 

Python Interpreter 選中虛擬環境

Python - 虛擬環境 venv

 

安裝專案所需要的庫

Python - 虛擬環境 venv

 

Pycharm 建立虛擬環境

Python - 虛擬環境 venv

  1. 選中 Python Interpreter
  2. 檢視更多 Interpreters
  3. 新增一個新的 Interpreters
  4. 選擇 New environment,預設選項即可,確定

Python - 虛擬環境 venv

 

檢視虛擬環境的目錄

Python - 虛擬環境 venv

剛剛建立的兩個虛擬環境的目錄其實是一樣的

 

bin

與虛擬環境互動的檔案

>> ll
total 72
-rw-r--r--  1 polo  staff   8.6K Sep 14 09:26 Activate.ps1
-rw-r--r--  1 polo  staff   1.9K Sep 14 09:26 activate
-rw-r--r--  1 polo  staff   882B Sep 14 09:26 activate.csh
-rw-r--r--  1 polo  staff   2.0K Sep 14 09:26 activate.fish
-rwxr-xr-x  1 polo  staff   269B Sep 14 08:40 pip
-rwxr-xr-x  1 polo  staff   269B Sep 14 08:40 pip3
-rwxr-xr-x  1 polo  staff   269B Sep 14 08:40 pip3.9
lrwxr-xr-x  1 polo  staff     9B Sep 14 08:40 python -> python3.9
lrwxr-xr-x  1 polo  staff     9B Sep 14 08:40 python3 -> python3.9
lrwxr-xr-x  1 polo  staff    39B Sep 14 08:40 python3.9 -> /usr/local/opt/[email protected]3.9/bin/python3.9

 

include

編譯 Python 包的 C 標頭檔案

 

lib

包含Python 版本的副本(python3.9),以及安裝每個依賴包的 site-packages 資料夾

>> pwd
/Users/polo/Downloads/FastAPI_project/fastapi_test/lib/python3.9/site-packages

>> ll
total 224
drwxr-xr-x   3 polo  staff    96B Sep 14 09:27 __pycache__
drwxr-xr-x   5 polo  staff   160B Sep 14 08:40 _distutils_hack
-rw-r--r--   1 polo  staff   152B Sep 14 08:40 distutils-precedence.pth
drwxr-xr-x  28 polo  staff   896B Sep 14 09:27 fastapi
drwxr-xr-x   8 polo  staff   256B Sep 14 09:27 fastapi-0.68.1.dist-info
drwxr-xr-x   8 polo  staff   256B Sep 14 08:40 pip
drwxr-xr-x  10 polo  staff   320B Sep 14 08:40 pip-21.1.1.dist-info
drwxr-xr-x   7 polo  staff   224B Sep 14 08:40 pkg_resources
drwxr-xr-x  53 polo  staff   1.7K Sep 14 09:27 pydantic
drwxr-xr-x   9 polo  staff   288B Sep 14 09:27 pydantic-1.8.2.dist-info
drwxr-xr-x  41 polo  staff   1.3K Sep 14 08:40 setuptools
drwxr-xr-x  11 polo  staff   352B Sep 14 08:40 setuptools-56.0.0.dist-info
drwxr-xr-x  27 polo  staff   864B Sep 14 09:27 starlette
drwxr-xr-x   8 polo  staff   256B Sep 14 09:27 starlette-0.14.2.dist-info
drwxr-xr-x   8 polo  staff   256B Sep 14 09:27 typing_extensions-3.10.0.2.dist-info
-rw-r--r--   1 polo  staff   107K Sep 14 09:27 typing_extensions.py

 

從虛擬環境生成 requirement.txt

先看看有哪些包

> pip list
Package           Version
----------------- --------
fastapi           0.68.1
pip               21.1.1
pydantic          1.8.2
setuptools        56.0.0
starlette         0.14.2
typing-extensions 3.10.0.2

 

pip freeze 

在啟用虛擬環境下敲

pip freeze > requirement.txt  

Python - 虛擬環境 venv

這樣生成的 requirement.txt 檔案就只包含虛擬環境中已安裝的依賴包了!

 

包管理利器 popety

TODO