Python 專案結構 範例

筆者與 Python 的接觸甚少,最近因為工作方面有個小專案需要使用 Python 開發,所以又回來和她相處看看。 在嘗試過網路上的專案結構建議後,遇到一些小問題,所以來和大家分享一下。

正常的專案結構很可能會像下面的樣子:
	
my-project
|-- src/
|   `-- __init__.py
|-- test/
|   `-- __init__.py
|-- main.py
`-- requirements.txt
	

main.py

main.py 是程式的入口檔,忘記是從哪裡的最佳實踐學來的,筆者直接把 main.py 放在 src 資料夾內,在本機使用 Pycharm 這樣非常聰明的編輯器開發起來是沒有什麼問題的。但是當檔案一多,在 src 下還有子資料夾,子資料夾裡面還有 .py 檔案,在執行時就很容易發生問題。

筆者當時的專案是長這樣的:
	
my-project
`-- src/
    |-- database/
    |   `-- connector.py
    |-- api/
    `-- main.py
	
在 main.py 中是這樣使用 connector.py 中的 function:
    
from src.database.connector import my_function
    

在本機執行時都沒有問題(因為 Pycharm 編輯器會自動設定執行路徑),但是放到目標環境就出錯了,因為在 import 的時候有 src 資料夾,但是對於執行時在 main 本身來說他就在 src 資料夾內,應該要直接 from database.connector import my_function (不要 src),所以執行就出現錯誤(當然也可以解決,但是部署到很多台機器時就會遇到問題)。

所以最好把 main.py 放在專案根目錄中,避免憑空多出許多討厭的問題。

__init__.py

筆者會在 src 和 test 資料夾中建立 __init__.py 檔案,裡面可以是空的,完全沒有任何內容。有了 __init__.py 檔案後就代表這個資料夾會被視為是 Python 的一個套件,會將此目錄視為 python 目錄。最膚淺的理解就是對於 import 來說會比較簡單,因為會在此 Python 資料夾中尋找子模組。

requirements.txt

在 Python 中如果有使用到其他套件,通常都會需要透過 pip install 來安裝,如果使用到的套件一多,或是有限制套件的版本,在一開始要執行時就很繁瑣,很可能會執行到一半才發現套件有問題。這時候就可以透過 requirements.txt 檔案來一次將所有套件安裝完畢,具體的使用方式可以查看這篇: 使用 requirements.txt 管理 Python 專案套件版本

筆者資歷很淺,以 Python 來說更甚,還希望大神多指點,感激不盡!

參考資料:
Stack Overflow - What is __init__.py for?

留言