Python - 虛擬環境 venv

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

什麼是虛擬環境

  • 這是 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/python@3.9/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 

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

 

關閉虛擬環境

deactivate

 

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

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

 

Python Interpreter 選中虛擬環境

 

安裝專案所需要的庫

 

Pycharm 建立虛擬環境

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

 

檢視虛擬環境的目錄

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

 

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/python@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  

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

 

包管理利器 popety

TODO

相關文章