標籤:str 使用者 內容 ini 安裝環境 存在 最好 16px ref
為什麼要規範軟體目錄結構?
- 可讀性高: 不熟悉這個項目的代碼的人,一眼就能看懂目錄結構,知道程式啟動指令碼是哪個,測試目錄在哪兒,設定檔在哪兒等等。從而非常快速的瞭解、跟進這個項目。
- 可維護性高: 定義好組織規則後,維護者就能很明確地知道,新增的哪個檔案和代碼應該放在什麼目錄之下。這個好處是,隨著時間的推移,代碼/配置的規模增加,項目結構不會混亂,仍然能夠組織良好。
所以,在實際項目開發過程中,良好的目錄結構是十分必要的。即使追求個人風格,也要在遵循基本的規範的基礎上,否則編寫的代碼只有自己願意看,這與在代碼編寫過程中必要的注釋是相同的。
目錄組織方式
假設項目名為foo,必要的目錄結構如下所示:
Foo/|-- bin/| |-- foo||-- foo/| |-- tests/| | |-- __init__.py| | |-- test_main.py| || |-- __init__.py| |-- main.py||-- docs/| |-- conf.py| |-- abc.rst||-- setup.py|-- requirements.txt|-- README
簡要解釋一下:
bin/: 存放項目的一些可執行檔,當然你可以起名script/之類的也行。
foo/: 存放項目的所有原始碼。(1) 原始碼中的所有模組、包都應該放在此目錄。不要置於頂層目錄。(2) 其子目錄tests/存放單元測試代碼; (3) 程式的入口最好命名為main.py。
docs/: 存放一些文檔,設定檔等。
setup.py: 安裝、部署、打包的指令碼。
requirements.txt: 存放軟體依賴的外部Python包列表,這隻是一個txt檔案。
README: 項目說明檔案。
關於設定檔:
此處設定檔conf.py並未直接放於源碼目錄下,而是放置在docs/目錄下,模組的配置應該是靈活的,不受外界設定檔的影響,所以不應當在代碼中直接import conf 來使用設定檔,可以通過給main.py啟動參數指定配置路徑的方式來讓程式讀取配置內容。
關於setup.py
一般來說,用setup.py來管理代碼的打包、安裝、部署問題。業界標準的寫法是用Python流行的打包工具setuptools來管理這些事情。這種方式普遍應用於開源項目中。不過這裡的核心思想不是用標準化的工具來解決這些問題,而是說,一個項目一定要有一個安裝部署工具,能快速便捷的在一台新機器上將環境裝好、代碼部署好和將程式運行起來。
整合打包時應核對requirements中所記錄的python包列表與實際使用的Python包是否吻合,包括使用包的版本
關於requirements.txt
這個檔案存在的目的是:
-
- 方便開發人員維護軟體的包依賴。將開發過程中新增的包添加進這個列表中,避免在
setup.py安裝依賴時漏掉軟體包。
- 方便讀者明確項目使用了哪些Python包,通過包的學習快速跟進項目程式。
requirements.txt中存放軟體依賴的外部Python包列表最好和開發過程中軟體實際使用的Python包保持即時同步,這樣在最後打包setup.py檔案時才不會有遺漏。
關於ReadMe
這個同setup.py一樣,是每個項目都應該有的一個檔案,目的是能簡要描述該項目的資訊,讓讀者快速瞭解這個項目。
它需要說明以下幾個事項:
-
- 軟體定位,軟體的準系統。
- 運行代碼的方法: 安裝環境、啟動命令等。
- 簡要的使用說明。
- 代碼目錄結構說明,更詳細點可以說明軟體的基本原理。
- 常見問題說明。
ReadMe的作用就好像是幹練的使用者使用手冊說明,這樣的文檔多在項目完結的時候進行撰寫。
由於軟體目錄結構的存在,不可避免的會存在跨目錄匯入模組的情況。
模組匯入詳解
先瞭解幾個概念:
- 模組(python file):本質是.py結尾的python檔案。
- 包(python package):本質是目錄(也就是上文介紹的目錄結構規範),在包中編寫模組,組織模組,每建立一個python package都會在自動產生一個__init__.py檔案。
匯入方法:
- 匯入模組方法:
1 # 基本匯入模組2 import sys3 # 同時匯入多個模組4 import sys, copy, numpy, pandas5 # 同時匯入多個模組並部分重新命名6 import sys, numpy as np, pandas as pd, tensorflow as tf7 8 #從某個包中匯入某個模組9 from tensorflow.contrib import rnn
import只能匯入目前的目錄,標準庫以及第三方庫中的模組。在import時,還可以直接匯入該模組中的某個變數或者是方法,即import XXX.xxx (xxx可以是變數或是方法)
2. 多級目錄匯入方法:
需要瞭解兩個模組:
1 # 多級目錄匯入方法:2 import sys, os3 sys.path() # 返回執行當前檔案執行搜尋的所有路徑4 BaseDir = os.path.abspath(__file__) # 擷取當前檔案的路徑5 addDir = os.path.dirname(os.path.dirname(BaseDir)) # 擷取父目錄位址6 sys.path.append(addDir) #將改地址添加至預設搜尋路徑中7 from logs import logger # 從包中匯入模組
sys.path():其傳回值是一個列表,內包含搜尋的所有路徑。
sys.path.append() : 是將目標路徑追加至列表的末尾,也就是說,在搜尋模組時,會先在目前的目錄進行搜尋,進而到標準庫,第三方庫中進行搜尋,如果都沒有改模組,才會到追加的這個路徑中進行搜尋。如果標準庫或第三方庫中存在同名的模組,將不能訪問到添加路徑下的模組。
sys.path.insert(): 會把路徑加入到python系統路徑列表的最前邊
python 軟體目錄結構規範 與 模組匯入