文檔內容學習於
http://www.cnblogs.com/xiaozhiqi/
參考:
https://www.cnblogs.com/monologuesmw/p/9490093.html
軟件目錄結構規范
- 可讀性高: 不熟悉這個項目的代碼的人,一眼就能看懂目錄結構,知道程序啟動腳本是哪個,測試目錄在哪兒,配置文件在哪兒等等。從而非常快速的了解、跟進這個項目。
- 可維護性高: 定義好組織規則后,維護者就能很明確地知道,新增的哪個文件和代碼應該放在什么目錄之下。這個好處是,隨着時間的推移,代碼/配置的規模增加,項目結構不會混亂,仍然能夠組織良好。
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中,如果要調用其他的腳本。 需要進行import。 但是如果程序在其他目錄線面,直接 import 會報錯的
以下是調取程序的 方法
我們現在有這么一個目錄
可以使用os.path
import os print (os.path.abspath(__file__)) # 打印文件路徑 print (os.path.dirname( os.path.abspath(__file__) )) # 打印目錄的路勁
執行結果
然后調取程序的話 看以下
[root@master Atm]# pwd #全路徑 /root/python/day4/Atm [root@master Atm]# tree #目錄結構,里面有3個py程序 . ├── bin │ └── atm.py # 主文件 ├── conf │ ├── __pycache__ │ │ └── setting.cpython-36.pyc │ └── setting.py #被調取程序1 └── foo ├── main.py #被調取程序2 └── __pycache__ └── main.cpython-36.pyc 5 directories, 5 files [root@master Atm]# cat bin/atm.py #主程序,執行的程序。 里面的程序下面會詳細解釋 ,先知道有這么一個文件。 #!/usr/bin/env python3 import os import sys print (os.path.abspath(__file__)) print (os.path.dirname( os.path.abspath(__file__) )) BASE_DIR= os.path.dirname(os.path.dirname( os.path.abspath(__file__) )) sys.path.append( BASE_DIR ) from conf import setting from foo import main main main.login() [root@master Atm]# cat conf/setting.py #被調取程序1 #!/usr/bin/env python3 print ("welcome") [root@master Atm]# cat foo/main.py #被調取程序2,里面是個函數 #!/usr/bin/env python3 def login(): print ("please login")
執行主程序。調取另外2個程序
[root@master Atm]# ls bin conf foo [root@master Atm]# cat ./bin/atm.py #!/usr/bin/env python3 import os import sys print (os.path.abspath(__file__)) #打印文件路勁 print (os.path.dirname( os.path.abspath(__file__) )) #打印文件的目錄路勁,這個時候是在bin這一層。
print (os.path.dirname(os.path.dirname( os.path.abspath(__file__) ))) #打印文件的目錄路勁, 這個時候是在atm這一層。就是os.path.dirname這個再用了一次 BASE_DIR= os.path.dirname(os.path.dirname( os.path.abspath(__file__) )) # 要調取其他目錄下的文件。 需要在atm這一層才可以 sys.path.append( BASE_DIR ) # 將這個路徑添加到環境變量中。 from conf import setting # 根據目錄調取程序(文件) from foo import main # 根據目錄調取程序(文件) setting #直接執行程序
main.login() #執行程序中的函數 [root@master Atm]# ./bin/atm.py # 看執行結果 /root/python/day4/Atm/bin/atm.py /root/python/day4/Atm/bin
/root/python/day4/Atm welcome #執行了setting的程序
please login #執行了main的程序
這樣就搞定了,跨目錄調取文件 。
注意:
在pycharm中如果發現 調取其他程序中的模塊,有紅線時,如果確定自己的語法沒問題,並且模塊確實存在且能調到。忽略它。不影響執行。(如果執行報錯,就是代碼有問題)。
因為pycharm是動態加載的。 可能是因為 pycharm本生就沒有這2個模塊的 。所以報紅線。 但是左側的目錄樹里面 ,是正常的。 不影響執行。