1. 程式人生 > >python學習筆記:目錄結構

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

簡要解釋一下:

  1. bin/: 存放專案的一些可執行檔案,當然你可以起名script/之類的也行。
  2. conf/:存放專案配置檔案
  3. foo/: 存放專案的所有原始碼。(1) 原始碼中的所有模組、包都應該放在此目錄。不要置於頂層目錄。(2) 其子目錄tests/存放單元測試程式碼; (3) 程式的入口最好命名為main.py
  4. docs/: 存放一些文件。
  5. setup.py: 安裝、部署、打包的指令碼。
  6. requirements.txt: 存放軟體依賴的外部Python包列表。
  7. 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分別是使用者登入註冊、支付、生成訂單專案程式碼.