Python – 虛擬環境 venv

什麼是虛擬環境

  • 這是 Python 3.3 的新特性://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 

可以看到虛擬環境中的 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