Python一行命令實(shí)現(xiàn)自動(dòng)生成?requirements.txt
在 Python 項(xiàng)目開(kāi)發(fā)中,我們經(jīng)常需要生成 requirements.txt 文件,用于:
- 項(xiàng)目部署
- Docker 構(gòu)建
- 服務(wù)器上線(xiàn)
- 團(tuán)隊(duì)協(xié)作
很多人直接使用:
pip freeze > requirements.txt
但這樣會(huì)把當(dāng)前環(huán)境的所有包都導(dǎo)出來(lái),包括根本沒(méi)用到的庫(kù),文件又大又亂。
今天給大家介紹一個(gè)更優(yōu)雅、更智能的工具 —— pipreqs。
一、什么是 pipreqs
pipreqs 是一個(gè)根據(jù)項(xiàng)目源碼中 import 自動(dòng)生成 requirements.txt 的工具。
它只會(huì)生成你真正用到的依賴(lài),不會(huì)把整個(gè)虛擬環(huán)境都打包進(jìn)去。
相比 pip freeze:
| 工具 | 特點(diǎn) |
|---|---|
| pip freeze | 導(dǎo)出全部環(huán)境依賴(lài) |
| pipreqs | 只導(dǎo)出項(xiàng)目實(shí)際使用依賴(lài) |
二、安裝 pipreqs
pip install pipreqs
說(shuō)明:
- 直接使用 pip 安裝即可
- 支持 Python 3.x
- 建議在虛擬環(huán)境中使用
三、一行命令生成 requirements.txt
進(jìn)入你的項(xiàng)目目錄,然后執(zhí)行:
pipreqs . --force
參數(shù)說(shuō)明:
| 參數(shù) | 作用 |
|---|---|
| . | 當(dāng)前目錄 |
| --force | 強(qiáng)制覆蓋已存在的 requirements.txt |
執(zhí)行后,項(xiàng)目根目錄就會(huì)自動(dòng)生成:
requirements.txt
就這么簡(jiǎn)單!
四、pipreqs 工作原理
pipreqs 會(huì):
- 掃描當(dāng)前目錄所有
.py文件 - 解析
import語(yǔ)句 - 匹配對(duì)應(yīng) PyPI 包名
- 自動(dòng)生成 requirements.txt
例如:
import requests import numpy import pandas
生成結(jié)果:
numpy==1.26.4 pandas==2.2.1 requests==2.31.0
只包含你真正用到的依賴(lài)
五、常用高級(jí)用法
1.指定生成路徑
pipreqs ./your_project
2.忽略某些目錄
pipreqs . --ignore tests
3.使用國(guó)內(nèi)鏡像(推薦)
如果你在國(guó)內(nèi),建議加上:
pipreqs . --pypi-server https://pypi.tuna.tsinghua.edu.cn/simple
這樣解析更快。
六、pipreqs vs pip freeze 對(duì)比實(shí)戰(zhàn)
假設(shè)你的虛擬環(huán)境里安裝了 100 個(gè)包,但項(xiàng)目只用了 5 個(gè)。
使用 pip freeze:
100 個(gè)依賴(lài)
使用 pipreqs:
5 個(gè)依賴(lài)
優(yōu)點(diǎn):
- 更干凈
- 更專(zhuān)業(yè)
- 更適合開(kāi)源項(xiàng)目
- Docker 鏡像更小
七、注意事項(xiàng)
- pipreqs 只能識(shí)別
import語(yǔ)句 - 動(dòng)態(tài)導(dǎo)入可能識(shí)別不到
- 有些包名和 import 名不一致(例如
Pillow)
遇到問(wèn)題可以手動(dòng)補(bǔ)充。
八、最佳實(shí)踐建議
開(kāi)發(fā)階段:使用 pipreqs 生成干凈依賴(lài)
部署階段:再用 pip freeze 做最終鎖版本
這樣最穩(wěn)。
九、總結(jié)
兩行命令解決依賴(lài)管理問(wèn)題:
pip install pipreqs pipreqs . --force
- 自動(dòng)分析項(xiàng)目
- 只生成真實(shí)依賴(lài)
- 更專(zhuān)業(yè)的 requirements.txt
- 部署更輕量
十、為什么 pipreqs 識(shí)別不到數(shù)據(jù)庫(kù)依賴(lài)
很多同學(xué)會(huì)遇到一個(gè)問(wèn)題:明明項(xiàng)目用了數(shù)據(jù)庫(kù),結(jié)果生成的 requirements.txt 里沒(méi)有 psycopg2?
例如項(xiàng)目里使用了 PostgreSQL:
import psycopg2
但有時(shí)候生成的文件里卻沒(méi)有:
psycopg2
這是為什么呢?
原因分析
1.動(dòng)態(tài)導(dǎo)入或框架間接依賴(lài)
如果你沒(méi)有直接寫(xiě):
import psycopg2
而是使用了:
- Django
- SQLAlchemy
- Flask + 插件
例如:
DATABASES = {
"ENGINE": "django.db.backends.postgresql"
}
這類(lèi)字符串配置方式,pipreqs 是識(shí)別不到的。
因?yàn)樗环治?import 語(yǔ)句。
2.驅(qū)動(dòng)是可選依賴(lài)
很多 ORM 框架不會(huì)強(qiáng)制安裝數(shù)據(jù)庫(kù)驅(qū)動(dòng)。
例如:
Django不會(huì)自動(dòng)安裝psycopg2SQLAlchemy也不會(huì)自動(dòng)安裝數(shù)據(jù)庫(kù)驅(qū)動(dòng)
驅(qū)動(dòng)屬于:可選運(yùn)行時(shí)依賴(lài)
而不是源碼級(jí) import 依賴(lài)。
解決方案
方案一:手動(dòng)補(bǔ)充(推薦)
直接在生成后手動(dòng)添加:
psycopg2-binary==2.9.9
生產(chǎn)環(huán)境推薦:
psycopg2
開(kāi)發(fā)環(huán)境推薦:
psycopg2-binary
方案二:顯式 import(不太優(yōu)雅)
你可以在某個(gè)文件里寫(xiě):
import psycopg2
這樣 pipreqs 就能識(shí)別到了。
但這種方式:
- 不夠優(yōu)雅
- 會(huì)污染代碼結(jié)構(gòu)
不太推薦。
方案三:使用 pipreqs + pip freeze 結(jié)合
最佳實(shí)踐流程:
# 第一步:生成干凈依賴(lài) pipreqs . --force # 第二步:確認(rèn)數(shù)據(jù)庫(kù)驅(qū)動(dòng) pip freeze | grep psycopg2
如果缺失,手動(dòng)追加即可。
延伸說(shuō)明:其他常見(jiàn)識(shí)別不到的庫(kù)
除了 psycopg2,以下場(chǎng)景也常見(jiàn):
| 場(chǎng)景 | 舉例 |
|---|---|
| 數(shù)據(jù)庫(kù)驅(qū)動(dòng) | mysqlclient、psycopg2 |
| WSGI 服務(wù)器 | gunicorn |
| ASGI 服務(wù)器 | uvicorn |
| 任務(wù)隊(duì)列 | celery |
| 生產(chǎn)工具 | redis |
這些通常:
- 運(yùn)行時(shí)依賴(lài)
- 部署依賴(lài)
- 不一定在源碼中 import
十一、深入理解依賴(lài)分類(lèi)
其實(shí)依賴(lài)可以分為三類(lèi):
代碼依賴(lài)(pipreqs 能識(shí)別)
import requests import pandas
運(yùn)行依賴(lài)(pipreqs 識(shí)別不到)
數(shù)據(jù)庫(kù)驅(qū)動(dòng)
WSGI 服務(wù)器
消息隊(duì)列客戶(hù)端
系統(tǒng)依賴(lài)(pip 管不了)
PostgreSQL 服務(wù)
Redis 服務(wù)
Nginx
十二、最佳企業(yè)實(shí)踐建議
在實(shí)際公司項(xiàng)目中,推薦做法:
開(kāi)發(fā)階段
pipreqs 生成干凈 requirements.txt
測(cè)試 / 發(fā)布階段
pip freeze > requirements-prod.txt
或者:
使用 Poetry / Pipenv 管理完整鎖版本
這樣:
- 開(kāi)發(fā)清爽
- 部署穩(wěn)定
- CI/CD 更安全
十三、總結(jié)
pipreqs 非常適合:
- 開(kāi)源項(xiàng)目
- 教學(xué)項(xiàng)目
- 輕量項(xiàng)目
- 想要干凈依賴(lài)的人
但記住一句話(huà):pipreqs 只認(rèn) import,不認(rèn)運(yùn)行環(huán)境。
數(shù)據(jù)庫(kù)驅(qū)動(dòng)、服務(wù)器組件這類(lèi)依賴(lài),一定要人工確認(rèn)。
以上就是Python一行命令實(shí)現(xiàn)自動(dòng)生成 requirements.txt的詳細(xì)內(nèi)容,更多關(guān)于Python生成requirements.txt文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python如何操作docker redis過(guò)程解析
這篇文章主要介紹了Python如何操作docker redis過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
利用Python實(shí)現(xiàn)在同一網(wǎng)絡(luò)中的本地文件共享方法
今天小編就為大家分享一篇利用Python實(shí)現(xiàn)在同一網(wǎng)絡(luò)中的本地文件共享方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
python中halcon環(huán)境配置的詳細(xì)步驟
這篇文章主要為大家詳細(xì)介紹了python中halcon環(huán)境配置的詳細(xì)步驟,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以了解一下2025-06-06
Python如何根據(jù)頁(yè)碼處理PDF文件的內(nèi)容
在Python中,fitz庫(kù)可以用于多種任務(wù),如打開(kāi)PDF文件、遍歷頁(yè)面、添加注釋、提取文本、旋轉(zhuǎn)頁(yè)面等,此外,它還可以用于在PDF頁(yè)面上添加高亮注釋、提取圖像等操作,這篇文章主要介紹了Python根據(jù)頁(yè)碼處理PDF文件的內(nèi)容,需要的朋友可以參考下2024-06-06
Python?curl_cffi庫(kù)從入門(mén)到精通詳解
curl_cffi 是一個(gè)Python庫(kù),它通過(guò)CFFI提供了對(duì)curl-impersonate的綁定,使得HTTP客戶(hù)端能夠模仿瀏覽器的TLS/JA3和HTTP/2指紋,這篇文章主要介紹了Python?curl_cffi庫(kù)從入門(mén)到精通的相關(guān)資料,需要的朋友可以參考下2025-09-09

