python 一些程序規范(跨目錄調用文件)


文檔內容學習於

http://www.cnblogs.com/xiaozhiqi/ 

 

 

參考:

https://www.cnblogs.com/monologuesmw/p/9490093.html

 

 

軟件目錄結構規范

  1. 可讀性高: 不熟悉這個項目的代碼的人,一眼就能看懂目錄結構,知道程序啟動腳本是哪個,測試目錄在哪兒,配置文件在哪兒等等。從而非常快速的了解、跟進這個項目。
  2. 可維護性高: 定義好組織規則后,維護者就能很明確地知道,新增的哪個文件和代碼應該放在什么目錄之下。這個好處是,隨着時間的推移,代碼/配置的規模增加,項目結構不會混亂,仍然能夠組織良好。
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的作用就好像是干練的用戶使用手冊說明,這樣的文檔多在項目完結的時候進行撰寫。

 

跨目錄讀取程序文件

在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個模塊的 。所以報紅線。  但是左側的目錄樹里面 ,是正常的。 不影響執行。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM