簡介:
作為 Python 開發人員,管理專案依賴項是一項經常被忽視的例行任務,直到它沒有被注意到。 pip freeze 的簡單性 > requirements.txt 可能很有吸引力,但在更複雜的專案中,它可能會導致意想不到的問題,從而擾亂工作流程。在遇到幾個障礙後,我發現了更可靠、更完善的依賴關係管理方法,我想與大家分享。
點凍結的問題:
指令 pip freeze > requirements.txt 已成為許多開發人員的標準做法。雖然它在大多數情況下都有效,但它有一些明顯的缺點:
包含不必要的軟體包: pip freeze 捕獲所有已安裝的軟體包,包括作為其他軟體包的依賴項自動安裝的軟體包。這會導致requirements.txt變得臃腫,其中可能包含您的專案不直接依賴的套件。
版本衝突:包含自動安裝的依賴項有時會引入版本衝突,特別是當這些依賴項對於您的專案不是必需的但其他套件需要時。
環境特定問題: pip freeze 反映了環境的當前狀態,其中可能包括為特定本地需求安裝的軟體包,從而導致在另一台電腦上複製環境時出現問題。
遇到障礙:
在嘗試複製我的專案環境時,我直接遇到了這些問題。我使用 pip freeze 產生了requirements.txt,但是當我嘗試在新的虛擬環境中安裝這些依賴項時,遇到了以下錯誤:
ERROR: Could not find a version that satisfies the requirement cloud-init==23.1.2 (from -r requirements.txt (line 13)) (from versions: none) ERROR: No matching distribution found for cloud-init==23.1.2 (from -r requirements.txt (line 13))
這個錯誤令人沮喪,因為 cloud-init 是我從未直接安裝過的軟體包。它被作為依賴項引入,但 pip freeze 捕獲了它,就好像它是我專案的一等公民一樣。
尋找解決方案:
為了解決這些問題,我轉向使用 pipreqs 和 pip-tools 的更精細的方法。以下是解決我的依賴管理問題的逐步過程:
首先,我安裝了 pipreqs 和 pip-tools,它們提供了更精細的依賴管理方法:
pip install pipreqs pip-tools
我沒有使用 pip freeze,而是使用 pipreqs 產生了一個requirements.in 文件,該文件僅包含我的專案中直接使用的套件。這可以防止包含不必要的依賴項:
pipreqs ./ --savepath requirements.in --force --ignore ./venv/,./test_venv/ --mode no-pin
以下是每個標誌的作用:
接下來,我使用 pip-tools 中的 pip-compile 產生最終的requirements.txt:
pip-compile
此步驟可確保僅包含必要版本的軟體包,從而提供乾淨且無衝突的requirements.txt。
最後,我安裝了新產生的requirements.txt中的依賴項:
pip install -r requirements.txt
這種方法產生了更精簡且更易於管理的requirements.txt 文件,消除了不必要的套件和版本衝突。
結論:
使用 pipreqs 和 pip-tools 從 pip freeze 切換到更強大的依賴關係管理流程,改變了我的工作流程。它不僅解決了眼前的問題,也讓我更控制了專案的依賴關係。
如果您一直依賴 pip freeze 並面臨類似的挑戰,我強烈建議您嘗試這種方法。這是一個小小的轉變,可以對 Python 專案的穩定性和可移植性產生很大的影響。
以上是在Python中提取您的requirements.txt的最簡單方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!