python學習筆記:目錄結構
"專案目錄結構"其實也是屬於"可讀性和可維護性"的範疇。
目錄組織方式
關於如何組織一個較好的Python工程目錄結構,已經有一些得到了共識的目錄結構。在Stackoverflow的這個問題上,能看到大家對Python目錄結構的討論。
這裡面說的已經很好了,我也不打算重新造輪子列舉各種不同的方式,這裡面我說一下我的理解和體會。
假設你的專案名為foo, 我比較建議的最方便快捷目錄結構這樣就足夠了:
Foo/ |-- bin/ | |-- foo |
|--conf/
| |--__init__.py
| |--settings.py
| |-- foo/ | |-- tests/ | | |-- __init__.py | | |-- test_main.py | | | |-- __init__.py | |-- main.py | |-- docs/ | |-- conf.py | |-- abc.rst | |-- setup.py |-- requirements.txt |-- README
簡要解釋一下:
bin/
: 存放專案的一些可執行檔案,當然你可以起名script/
之類的也行。- conf/:存放專案配置檔案
foo/
: 存放專案的所有原始碼。(1) 原始碼中的所有模組、包都應該放在此目錄。不要置於頂層目錄。(2) 其子目錄tests/
存放單元測試程式碼; (3) 程式的入口最好命名為main.py
。docs/
: 存放一些文件。setup.py
: 安裝、部署、打包的指令碼。requirements.txt
: 存放軟體依賴的外部Python包列表。README
: 專案說明檔案。
除此之外,有一些方案給出了更加多的內容。比如LICENSE.txt
ChangeLog.txt
檔案等,我沒有列在這裡,因為這些東西主要是專案開源的時候需要用到。如果你想寫一個開源軟體,目錄該如何組織,可以參考這篇文章。
如何使用不同目錄下的檔案
以上圖目錄結構為例,我們在main.py中,使用bin目錄下檔案,首先需要找到Foo/目錄,然後才能匯入Foo/下的子目錄的模組,並且需要做到自動獲取,不能寫死,這時候就使用到os模組
import os
import sys
1、找到檔案的絕對路徑
os.path.abspath(__file__) #獲取檔案的絕對路徑,包含檔名
2、獲取檔案的目錄
os.path.dirname(os.path.abspath(__file__) ) # 例如main.py的目錄是foo/
3、再次獲取檔案目錄的父目錄
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__) ))
4、新增到環境變數中
sys.path.append(BASE_DIR)
5、匯入需要的目錄
①. import bin
②. from bin import *
二種方式匯入,各有優缺點,後續會詳細講解,至此,就可以使用其他目錄的模組。
=======================以上是我複製來的,以下用上課內容作為舉例。=============================
舉例:
start.py中的內容:
from lib.service import server #匯入server from lib import user,pay,order #匯入其他的模組 from conf.setting import server_info #匯入資料庫配置資訊 server.run(**server_info) #啟動服務
setting.py中的內容:
#mysql 配置資訊、連線資料庫 mysql_info = { 'host':'xxx.xx.x.xx', 'port':3306, 'user':'xxx, 'password':'123456', 'db':'xxx', 'charset':'utf8', 'autocommit':True } #啟動的配置檔案 server_info = { "host":'0.0.0.0', "port":5000, #啟動服務的埠號 'debug':True #是否是除錯模式 }
service.py中的內容:
#這個就指提供服務,直接寫一個server.py檔案,誰要用就匯入 import flask server = flask.Flask(__name__) #把當前這個python檔案當做一個服務
tools.py中的內容:
#工具模組 import pymysql from conf.setting import mysql_info # 匯入我們在conf.setting裡寫的函式 def my_db(sql):#執行資料庫 conn = pymysql.connect(**mysql_info)#兩個星號把字典自動變成v-k形式 cur = conn.cursor(cursor=pymysql.cursors.DictCursor) cur.execute(sql) res = cur.fetchall() cur.close() conn.close() return res def check_float(s): ''' 這個函式的作用就是判斷傳入的字串是否是合法的小數 :param s: 傳入一個字串 :return: True/false ''' s = str(s) if s.count('.')==1: s_split = s.split('.') left,right = s_split if left.isdigit() and right.isdigit(): return True elif left.startswith('-') and left[1:].isdigit() \ and right.isdigit(): return True return False
而user.py、pay.py、order.py分別是使用者登入註冊、支付、生成訂單專案程式碼.