Python依賴管理Pipfile與Pipfile.lock使用及說明
本文檔詳細介紹了 Python 項目中 Pipfile 和 Pipfile.lock 的作用、原理,以及它們與傳統(tǒng) requirements.txt 的區(qū)別。
1. 它們是什么?
這兩個文件是 Python 依賴管理工具 Pipenv 的核心組件。
如果你熟悉前端開發(fā)(Node.js),可以這樣類比:
Pipfile≈ \approx ≈package.jsonPipfile.lock≈ \approx ≈package-lock.json或yarn.lock
它們的設計目的是為了解決 Python 傳統(tǒng)依賴管理(pip + requirements.txt)中的一些痛點,如版本沖突、開發(fā)依賴分離困難、環(huán)境一致性差等。
2. 文件詳解
2.1 Pipfile (給人看的)
這是一個 TOML 格式的文件,用來聲明項目需要哪些包。它只記錄你直接安裝的頂層依賴。
主要特點:
- 易讀性:結(jié)構(gòu)清晰。
- 環(huán)境分離:明確區(qū)分
[packages](生產(chǎn)環(huán)境)和[dev-packages](開發(fā)測試環(huán)境)。 - 版本靈活:通常只指定最低版本或模糊版本(如
*),表明意圖。 - Python 版本指定:可以鎖定項目所需的 Python 解釋器版本。
示例 Pipfile:
[[source]] url = "https://pypi.org/simple" verify_ssl = true name = "pypi" [packages] requests = "*" # 安裝最新版 fastapi = ">=0.68.0" # 指定最低版本 [dev-packages] pytest = "*" black = "*" [requires] python_version = "3.10"
2.2 Pipfile.lock (給機器看的)
這是一個自動生成的 JSON 文件,絕對不應該手動修改。
主要特點:
- 確定性構(gòu)建 (Deterministic Builds):它通過運行
pipenv lock生成,將Pipfile中模糊的依賴解析為具體的版本號(例如requests的*變成了2.28.1)。 - 依賴樹鎖定:不僅僅鎖定你安裝的包,還鎖定了這些包所依賴的所有子包(Sub-dependencies)。
- 安全哈希:包含每個包文件的 Hash 值。這保證了在任何機器上安裝時,下載的文件內(nèi)容必須與生成 Lock 文件時完全一致,防止中間人攻擊或包被篡改。
3. 為什么很多人“寫了很久 Python 也沒用過”?
這在 Python 社區(qū)非常正常,主要原因有三點:
1.requirements.txt 的統(tǒng)治地位
- 它是 Python 最原始、最通用的依賴列舉方式。
- 幾乎所有的云平臺(AWS, GCP, Azure)、CI/CD 工具和 IDE 都原生完美支持它。
- 對于簡單的腳本或小型微服務,它完全夠用。
2.生態(tài)分裂 (The “Packaging War”)
- Python 的包管理工具有很多流派。
- Conda: 數(shù)據(jù)科學和 AI 領域(PyTorch, TensorFlow)通常使用 Conda 和
environment.yml,完全不依賴 Pipenv。 - Poetry / PDM / uv: 這是目前更現(xiàn)代的選擇。Pipenv 曾有一段時間維護停滯,導致社區(qū)轉(zhuǎn)向了基于官方標準
pyproject.toml的工具(如 Poetry)。
3.非官方標準
Pipfile是 Pipenv 項目定義的格式,并不是 Python 官方標準(PEP)。目前的官方趨勢是統(tǒng)一使用pyproject.toml來管理項目配置和依賴。
4. 對比:Pipenv vs requirements.txt
| 特性 | requirements.txt | Pipfile / Pipenv |
|---|---|---|
| 依賴解析 | 弱(容易出現(xiàn)版本沖突) | 強(自動計算版本兼容性) |
| 版本鎖定 | 需要手動 pip freeze (不直觀) | 自動 (Pipfile.lock 鎖定所有子依賴) |
| 開發(fā)依賴 | 通常需要維護兩個文件 (requirements.txt, dev.txt) | 內(nèi)置支持 ([dev-packages]) |
| 虛擬環(huán)境管理 | 手動 (python -m venv venv) | 自動 (自動創(chuàng)建和管理 hidden venv) |
| 安裝速度 | 快 | 慢 (依賴解析算法復雜,Lock 過程較慢) |
| 通用性 | 極高 | 中等 (需要安裝 pipenv) |
5. 什么時候該用哪個?
繼續(xù)使用 requirements.txt:
- 你正在編寫 Docker 鏡像(如本項目),
pip install -r requirements.txt是最簡單、層級最少的命令。 - 團隊已經(jīng)習慣了這種方式,且項目依賴關(guān)系不復雜。
使用 Pipenv (Pipfile):
- 你需要嚴格的確定性構(gòu)建,確保生產(chǎn)環(huán)境和開發(fā)環(huán)境的每一個包版本(包括子依賴)都連 Hash 值都一樣。
- 你喜歡不用手動管理
source venv/bin/activate的便利。
使用 Poetry / uv (pyproject.toml):
- 推薦方向。如果你要開始一個新項目,或者想要構(gòu)建一個 Python 包發(fā)布到 PyPI。
- 它們使用現(xiàn)代標準的
pyproject.toml,速度更快(尤其是uv),體驗更好。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python中操作MySQL和SQL Server數(shù)據(jù)庫的實戰(zhàn)指南
本文詳細介紹了如何在Pvthon中使用pymysql和pymssql庫進行MySQL和SQLServer數(shù)據(jù)庫的基本操作,包括連接、查詢、插入、更新、異常處理、參數(shù)化查詢、ORM應用、事務處理以及連接池的使用,為讀者提供了一套全面的數(shù)據(jù)庫操作指南,需要的朋友可以參考下2025-11-11
python使用循環(huán)實現(xiàn)批量創(chuàng)建文件夾示例
這篇文章主要介紹了python使用循環(huán)實現(xiàn)批量創(chuàng)建文件夾示例,需要的朋友可以參考下2014-03-03
Python對集合使用sort()排序報錯AttributeError的解決方法
這篇文章主要為大家詳細介紹了 Python對集合使用sort()排序報錯AttributeError的解決方法,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下2025-11-11

