python 軟體目錄結構規範 與 模組匯入

來源:互聯網
上載者:User

標籤:str   使用者   內容   ini   安裝環境   存在   最好   16px   ref   

為什麼要規範軟體目錄結構?

  1. 可讀性高: 不熟悉這個項目的代碼的人,一眼就能看懂目錄結構,知道程式啟動指令碼是哪個,測試目錄在哪兒,設定檔在哪兒等等。從而非常快速的瞭解、跟進這個項目。
  2. 可維護性高: 定義好組織規則後,維護者就能很明確地知道,新增的哪個檔案和代碼應該放在什麼目錄之下。這個好處是,隨著時間的推移,代碼/配置的規模增加,項目結構不會混亂,仍然能夠組織良好。

所以,在實際項目開發過程中,良好的目錄結構是十分必要的。即使追求個人風格,也要在遵循基本的規範的基礎上,否則編寫的代碼只有自己願意看,這與在代碼編寫過程中必要的注釋是相同的。

目錄組織方式

假設項目名為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

簡要解釋一下:

  1. bin/: 存放項目的一些可執行檔,當然你可以起名script/之類的也行。
  2. foo/: 存放項目的所有原始碼。(1) 原始碼中的所有模組、包都應該放在此目錄。不要置於頂層目錄。(2) 其子目錄tests/存放單元測試代碼; (3) 程式的入口最好命名為main.py
  3. docs/: 存放一些文檔,設定檔等。
  4. setup.py: 安裝、部署、打包的指令碼。
  5. requirements.txt: 存放軟體依賴的外部Python包列表,這隻是一個txt檔案。
  6. README: 項目說明檔案。

關於設定檔:

此處設定檔conf.py並未直接放於源碼目錄下,而是放置在docs/目錄下,模組的配置應該是靈活的,不受外界設定檔的影響,所以不應當在代碼中直接import conf 來使用設定檔,可以通過給main.py啟動參數指定配置路徑的方式來讓程式讀取配置內容。

 關於setup.py

一般來說,用setup.py來管理代碼的打包、安裝、部署問題。業界標準的寫法是用Python流行的打包工具setuptools來管理這些事情。這種方式普遍應用於開源項目中。不過這裡的核心思想不是用標準化的工具來解決這些問題,而是說,一個項目一定要有一個安裝部署工具,能快速便捷的在一台新機器上將環境裝好、代碼部署好和將程式運行起來。

整合打包時應核對requirements中所記錄的python包列表與實際使用的Python包是否吻合,包括使用包的版本

關於requirements.txt

這個檔案存在的目的是:

    1. 方便開發人員維護軟體的包依賴。將開發過程中新增的包添加進這個列表中,避免在setup.py安裝依賴時漏掉軟體包。
    2. 方便讀者明確項目使用了哪些Python包,通過包的學習快速跟進項目程式。

  requirements.txt中存放軟體依賴的外部Python包列表最好和開發過程中軟體實際使用的Python包保持即時同步,這樣在最後打包setup.py檔案時才不會有遺漏。

關於ReadMe

這個同setup.py一樣,是每個項目都應該有的一個檔案,目的是能簡要描述該項目的資訊,讓讀者快速瞭解這個項目。

它需要說明以下幾個事項:

    1. 軟體定位,軟體的準系統。
    2. 運行代碼的方法: 安裝環境、啟動命令等。
    3. 簡要的使用說明。
    4. 代碼目錄結構說明,更詳細點可以說明軟體的基本原理。
    5. 常見問題說明。

ReadMe的作用就好像是幹練的使用者使用手冊說明,這樣的文檔多在項目完結的時候進行撰寫。

 

由於軟體目錄結構的存在,不可避免的會存在跨目錄匯入模組的情況。

模組匯入詳解

先瞭解幾個概念:

  1. 模組(python file):本質是.py結尾的python檔案。
  2. 包(python package):本質是目錄(也就是上文介紹的目錄結構規範),在包中編寫模組,組織模組,每建立一個python package都會在自動產生一個__init__.py檔案。

匯入方法:

  1. 匯入模組方法:
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.  多級目錄匯入方法:

需要瞭解兩個模組:

  • sys模組
  • os模組
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 軟體目錄結構規範 與 模組匯入

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.