天天看點

Python進階-一般項目結構及項目依賴自動生成方法

作者:機器i學習

一、Python一般項目結構

Python項目的目錄結構是一種以檔案夾為基本單元的樹形結構,按照一定的标準,把不同的檔案和檔案夾分類放在合适的位置,用于定義群組織代碼,以便能夠輕松地定位和索引相關代碼。其有助于我們存儲、開發和釋出代碼庫,保證開發過程順利進行,同時便于我們運作、測試和部署代碼。下面我們簡單介紹一下Python項目的目錄結構。

通常情況下,Python項目的目錄結構包含以下幾個檔案夾:

- config: 一般存放項目需要的配置檔案;
- data: 一般存儲該Python項目測試資料;
- src: 主要用于存放源代碼。它包含所有的.py檔案;
- docs: 存放項目相關文檔;
- tests: 用于存放測試腳本;
- utils: 常用工具類包,讀寫檔案、配置、簡單資料處理等工具函數;
- scripts: 存儲一些shell腳本或工具;
- README.md: 項目介紹,一般包括使用的環境,安裝的方法,軟體的基本原理、測試資料及常見問題等,越詳細越好;
- requirements.txt: 記錄項目依賴的軟體包及對應的版本号,明确項目使用了哪些Python包,可以使用指令安裝所有的依賴包pip install -r requirements.txt,具體requirements.txt檔案生成,詳見下一小節;
- setup.py: 安裝、部署、打包的腳本,python打包工具setuptools。           

如果項目是開源項目,則可能還會包括下面幾個檔案

- LICENSE: 協定檔案,可參考開源許可協定
- ChangeLog.txt: 記錄版本釋出的release note
- .gitignore: 項目代碼管理工具git的過濾檔案,表明上傳代碼時要忽略的檔案;           

當然,以上目錄也并不是絕對一成不變的,隻是一個建議,另外,除了以上項目目錄,可能還會包含一些可選的目錄,例如lib,api等等,這裡不再贅述。下面給出一個具體項目目錄結構,如圖1所示

Python進階-一般項目結構及項目依賴自動生成方法

圖1 python項目目錄結構

二、項目依賴自動生成

一個Python項目,多多少少都會依賴一些外部的包,本節我們就介紹一下Python項目如何自動生成項目的依賴檔案requirements.txt以及其使用方式。項目依賴檔案requirements.txt,主要有兩種生成方法,一種是依賴python自帶的包管理工具pip的方式;一種是依賴第三方庫pipreqs的方式。下面分别介紹一下這兩種方法。

pip freeze方法

pip freeze > requirements.txt           

在項目根目錄下,運作上面這條指令,會在目前目錄下生成一個requirements.txt檔案。但這裡要強調一點,使用此種方式生成的requirements.txt檔案,包括了目前整個Python環境的包,某些包也包含了@file路徑。這時,如果我們使用下面的指令

pip install -r requirements.txt           

安裝包時,就會遇到如下的錯誤:

Python進階-一般項目結構及項目依賴自動生成方法

圖2 報錯資訊

此時,我們可以利用下面的指令生成不包含@file路徑的requirements.txt檔案,具體指令如下所示 :

pip list --format=freeze > requirements.txt           

然後,我們可以進一步使用下面的指令,具體地排除某個包,指令如下:

pip freeze --exclude 包名 > requirements.txt 或
pip list --format=freeze --exclude 報名 > requirements.txt           

我們可以看到,通過以上指令,我們得到的是目前Python環境安裝的所有的包,不僅包括了項目需要依賴的包,還包括了項目不需要依賴的包。那麼,有沒有方法,可以精準地得到就是目前項目依賴的封包件呢?答案是,必須滴!具體方法見下文。

pipreqs方法

這是一個Python第三方的庫,這個工具的優點就是可以對項目目錄進行掃描,自動發現目前項目使用了哪些類庫或包,生成項目依賴清單。但是也有缺點,就是生成的依賴清單可能存在偏差,需要自己手動修改下。我們使用下面的指令來安裝pipreqs

pip install pipreqs           

然後,我們可以使用下面的指令,來生成項目依賴清單

pipreqs 目前項目根目錄 --encoding=utf-8 --force           

pipreqs用法說明

options:
--use-local 僅使用本地包資訊而不查詢 PyPI
--pypi-server <url> 使用自定義的 PyPi 伺服器
--proxy <url> 使用代理,參數将被傳遞給 requests 庫。您也可以在終端中設定環境參數:
$ export HTTP_PROXY="http://10.10.1.10:3128"
$ export HTTPS_PROXY="https://10.10.1.10:1080"
--debug 列印調試資訊
--ignore <dirs>... 忽略額外的目錄,每個目錄之間用逗号分隔
--no-follow-links 不跟随項目中的符号連結
--encoding <charset> 使用檔案打開的編碼參數
--savepath <file> 将要求清單儲存到指定的檔案中
--print 将要求清單輸出到标準輸出
--force 覆寫現有的 requirements.txt 檔案
--diff <file> 将 requirements.txt 檔案中的子產品與項目導入的子產品進行比較
--clean <file> 清理 requirements.txt 檔案,删除項目中未導入的子產品
--mode <scheme> 啟用 <compat>、<gt> 或 <non-pin> 方案的動态版本控制           

依賴檔案使用方式

在生成了項目依賴清單檔案之後,我們可以利用下面的方式來一鍵安裝所有依賴包或庫

pip install -r requirements.txt           

以上我們就介紹完了Python的一般項目目錄結構,以及Python項目自動生成項目依賴清單檔案requirements.txt的方法。

Reference

[1]. https://pip.pypa.io/en/stable/cli/pip_freeze/

[2]. https://github.com/bndr/pipreqs