大部分試圖簡化 Python 虛擬環境和依賴管理工作流程的新工具都不夠穩定,繼續使用 virtualenv/venv 和 pip 這樣的底層工具也是一個不錯的選擇,而且大多數人也是這么做的。它們雖然用起來有一點麻煩,但至少更可靠。
基本概念
下面是一些基本概念:
- PyPA:指 Python Packaging Authority,一個維護 Python 打包相關項目的小組,相關項目具體見 https://github.com/pypa。
- pip:Python 包安裝器。
- virtualenv:Python 虛擬環境管理工具。
- venv:Python 標准庫內置的虛擬環境管理工具,Python 3.3 加入,Python 3.5 開始作為管理虛擬環境的推薦工具,用法類似 virtualenv。如果你使用 Python 3,推薦使用 venv 來替代 virtualenv。
使用 virtualenv/venv 管理虛擬環境
venv 模塊
如果你使用 Python 3(具體說是 Python 3.3 及以上版本),推薦使用標准庫內置的 venv 模塊替代 virtualenv,兩者的使用方式基本相同,唯一不同的是創建虛擬環境的方式。
如果你使用 Python 2,那就只能選擇 virtualenv,你需要額外安裝它。我先假設你已經安裝了 pip,因為在 Python 2 >=2.7.9 或 Python 3 >=3.4 這些版本的 Python 會一並安裝 pip,其他版本可以參考文檔的安裝部分。在 Windows 下使用下面的命令安裝 virtualenv:
$ pip install virtualenv
其他操作系統可以使用下面的命令安裝:
$ sudo pip install virtualenv
盡管不推薦使用 sudo pip 的方式安裝 Python 包,但這仍然是最簡單和統一的方式。更安全的方式是使用系統包管理器來安裝,或是使用 pip --user 方式安裝。
創建虛擬環境
假設我們的項目名叫 snow,創建對應的文件夾然后切換到根目錄:
$ mkdir snow
$ cd snow
如果使用 venv,那么使用下面的命令創建虛擬環境,其中 snow-venv 是虛擬環境的名字,也作為創建的虛擬環境文件夾名稱,你可以自由修改(通常會使用 venv 或 env 作為虛擬環境名):
$ python -m venv snow-venv
如果使用 virtualenv,則使用下面的命令:
$ virtualenv snow-venv
這會在當前目錄創建名為 snow-venv 的虛擬環境文件夾,你需要把這個文件夾名稱加入 .gitignore 文件以便讓 Git 忽略。
激活虛擬環境
通過執行對應的激活腳本來激活虛擬環境,不同操作系統的激活命令(激活腳本及路徑)有一點不同。Windows(CMD.exe)使用下面的命令激活:
$ snow-venv\scripts\activate
Linux 和 macOS(bash/zsh)使用下面的命令:
$ source snow-venv/bin/activate
或:
$ . snow-venv/bin/activate
類似的,其他終端程序可以執行對應的激活腳本來激活虛擬環境。
激活虛擬環境以后,命令行提示符前會顯示當前虛擬環境的名字:
(snow-venv) $
使用 deactivate 命令可以退出虛擬環境。
使用 pip 管理依賴
簡單列一下基本用法,雖然大部分人都很熟悉了……以 Flask 為例,首先是安裝依賴:
(snow-venv) $ pip install flask
更新依賴:
(snow-venv) $ pip install --upgrade flask
或是:
(snow-venv) $ pip install -U flask
卸載依賴:
(snow-venv) $ pip uninstall flask
除此之外,還有 pip show flask 命令可以查看某個依賴的詳細信息,pip list 列出所有依賴。
下面的命令可以手動生成依賴列表:
(snow-venv) $ pip freeze > requirements.txt
如果你需要手動開發依賴和生產依賴,可以手動把開發相關的依賴放到單獨的文件,比如 requirements-dev.txt。
當你需要在新的機器創建程序運行環境時,(創建虛擬環境后)只需要使用下面的命令從依賴文件安裝所有依賴:
(snow-venv) $ pip install -r requirements.txt
如果安裝包的時候速度太慢,可以考慮設置 PyPI 國內鏡像,具體參考這篇文章。
從其他工具遷移回來
如果你想從 Pipenv 遷移回來,方法很簡單,只需要生成一個 requirements.txt 文件即可。使用下面的命令生成一般依賴列表:
$ pipenv lock -r
使用下面的命令輸出開發依賴列表:
$ pipenv lock -r --dev
然后手動把兩個命令的輸出保存為 requirements.txt 和 requirements-dev.txt。
從 Poetry、Conda 等其他工具遷移回來可以使用 pipreqs 來生成 requirements.txt,它會基於項目代碼的導入語句來生成依賴列表。
在下一篇文章,我會介紹一些輔助工具來搭配 virtualenv/venv+pip 使用,讓虛擬環境和依賴管理更方便,比如 virtualenvwrapper、pip-tools 等。