Python學習【第十一篇】不同目錄間模組的呼叫
本人最近在學python,參考了以下連結中博主的一系列文章,並轉載學習,希望對正在學習python的你有所幫助。
關於這部分,在博文http://www.cnblogs.com/linupython/p/7736816.html有詳細的說明,樓主較懶,就不重複實現了,以下內容轉載自該文章。
1.前言
上文已經講述了軟體專案開發目錄規範的若干事項,現在問題來了,我們遵循了專案目錄設計規範,不同目錄下設計了不同的函式和模組,怎麼實現對這些模組的呼叫,使其為專案整體所用呢?本章節講述的絕對路徑與相對路徑,以及不同目錄間模組如何呼叫將回答這個問題。
2.重要功能函式
1. __file__
功能:返回檔案自身所在的路徑。
請注意我們我們一般通過print(__file__)來返回獲得當前檔案所在的路徑,但是不能直接在命令列下以互動的方式來使用它,必須定義在一個儲存好的py檔案中後去執行它。
命令列下直接使用print(file)會報錯
另外這裡的路徑究竟是絕對路徑還是相對路徑呢?答案是兩個都不是,取決於執行時傳遞給python的檔案形式,如果以相對路徑的形式傳遞給python執行,那麼就返回相對路徑,反之則返回絕對路徑。
# D:/python/S13/Day5/test/bin/test.py 程式碼
print(__file__)
# Pycharm執行結果
"C:\Program Files (x86)\python3.6.1\python.exe" D:/python/S13/Day5/test/bin/test.py
D:/python/S13/Day5/test/bin/test.py
# CMD執行結果
D:\python\S13\Day5\test\bin>python D:/python/S13/Day5/test/bin/test.py #在檔案所在路徑下以絕對路徑方式傳入檔案,返回的仍然是絕對路徑
D:/python/S13/Day5/test/bin/test.py
D:\python\S13\Day5\test\bin>cd ..
D:\python\S13\Day5\test>python D:/python/S13/Day5/test/bin/test.py
D:/python/S13/Day5/test/bin/test.py
D:\python\S13\Day5\test>cd ..
D:\python\S13\Day5>python test/bin/test.py #只有以相對路徑形式傳入檔案,才能返回相對路徑
test/bin/test.py
2. os.path.dirname(file)
功能:返回給定引數檔案所在的目錄(路徑)。
注意返回的路徑是相對路徑還是絕對路徑取決於傳遞的引數形式,如果以絕對路徑形式傳入引數檔案,則返回絕對路徑,反之則返回相對路徑
>>> print(os.path.abspath('.'))
D:\python\S13\Day5
>>> print(os.path.dirname('test/bin/test.py'))
test/bin
>>> print(os.path.dirname('D:/python/S13/Day5/test/bin/test.py'))
D:/python/S13/Day5/test/bin
#Pycharm中執行結果相同
#D:/python/S13/Day5/test/bin/test.py程式碼
import os
print(os.path.dirname(os.path.abspath(__file__)))
#執行結果
"C:\Program Files (x86)\python3.6.1\python.exe" D:/python/S13/Day5/test/bin/test.py
D:\python\S13\Day5\test\bin
3. os.path.abspath(file)
功能:返回檔案物件的絕對路徑(包含檔案本身在內)
#test.py程式碼
import os
print(os.path.abspath(__file__))
#cmd下執行結果
D:\python\S13>python day5/test/bin/test.py
D:\python\S13\day5\test\bin\test.py
4. sys.path
功能:返回python當前可執行的環境變數
import sys
print(sys.path)
D:\python\S13>python day5/test/bin/test.py
['D:\\python\\S13\\day5\\test\\bin', 'C:\\Program Files (x86)\\python3.6.1\\pyth
on36.zip', 'C:\\Program Files (x86)\\python3.6.1\\DLLs', 'C:\\Program Files (x86
)\\python3.6.1\\lib', 'C:\\Program Files (x86)\\python3.6.1', 'C:\\Program Files
(x86)\\python3.6.1\\lib\\site-packages']
3. 絕對路徑與相對路徑
- 絕對路徑
絕對路徑是相當於根目錄而言描述了檔案物件完整的路徑,在任何路徑下通過絕對路徑一定可以找到該檔案。
>>> import os
>>> os.chdir('D:\\python\\S13\\Day5\\test\\bin')
>>> os.listdir()
['test.py']
>>> os.path.abspath('test.py')
'D:\\python\\S13\\Day5\\test\\bin\\test.py'
>>>
- 相對路徑
相對路徑是相對於一個特定的非根目錄而言來描述檔案的路勁的,只有在該指定的參考檔案目錄下通過相對路徑才可以訪問到該檔案。
>>> import os
>>> os.chdir('D:\\python\\S13\\Day5')
>>> os.path.dirname('test/bin/test.py')
'test/bin' # 返回的路徑是相對於當前所在目錄而言的非完整路徑
4. 不同目錄間模組如何呼叫
有了以上基礎知識的鋪墊,就可以實現不同目錄間模組的呼叫了,其實現的思路是先通過上述多個函式把專案根目錄獲取到,然後追加到系統環境變數中,最後from不同路徑import模組。
為什麼要先解決系統環境變數問題呢?這是因為相對於專案而言,預設的PATH只深入到被執行的python檔案所在的目錄這一層。
#test.py程式碼
import sys
print(sys.path)
D:\python\S13>python D:\python\S13\Day5\test\bin\test.py
['D:\\python\\S13\\Day5\\test\\bin', 'C:\\Program Files (x86)\\python3.6.1\\pyth
on36.zip', 'C:\\Program Files (x86)\\python3.6.1\\DLLs', 'C:\\Program Files (x86
)\\python3.6.1\\lib', 'C:\\Program Files (x86)\\python3.6.1', 'C:\\Program Files
(x86)\\python3.6.1\\lib\\site-packages']
#請注意返回的PATH中,只有列表的第一個元素跟專案本身有關,而且只深入到test.py所在的這一層目錄,其它的元素均為python自身預設的環境變數
因此只能從sys.path返回的列表第一個元素上著手,把專案的根目錄追加到PATH中,這樣才能方便呼叫專案中任何目錄下的模組。
下面通過一個直觀的栗子來實踐一下。
先截圖說明下專案目錄結構:
專案的根目錄是test這一級,假設test.py是我的入口檔案。
test.py程式碼如下:
import os,sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #這裡先通過os.path.abspath獲取入口檔案所在的絕對路徑,然後通過兩次呼叫os.path.dirname函式獲取到專案根目錄
sys.path.append(BASE_DIR) #把系統根目錄追加到環境變數中
from conf import settings
settings.check_path()
from core import main
main.sayhi()
conf/settings.py程式碼如下,用於檢測環境變數是否正確:
import os,sys
SYS_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
def check_path():
print("Let's begin to check the current PATH")
if SYS_PATH in sys.path:
print('Check PATH OK!')
else:
exit('Check PATH error,the program is exiting...')
core/main.py包含了需要執行的主要功能模組,程式碼如下:
def sayhi():
print('Hello world!')
執行test.py的結果如下:
"C:\Program Files (x86)\python3.6.1\python.exe" D:/python/S13/Day5/test/bin/test.py
Let's begin to check the current PATH
Check PATH OK!
Hello world!
可以看到我們獲得了預期的效果,成功實現了對其他目錄下模組的呼叫。
相關文章
- Python學習【第十四篇】shutil模組Python
- Python學習【第十二篇】time & datetime模組Python
- Python學習目錄Python
- python模組安裝目錄在哪裡Python
- Python學習【第十三篇】隨機數相關:random模組&string模組Python隨機random
- [Python模組學習] glob模組Python
- 花姐的python學習目錄Python
- 學習Python的urllib模組Python
- Python學習【第十篇】軟體目錄開發規範Python
- R呼叫python模組Python
- Python學習——logging模組Python
- Python學習——shelve模組Python
- Python學習——xml模組PythonXML
- Python學習——configparser模組Python
- Python學習——hashlib模組Python
- Python學習之模組Python
- webpack模組化學習記錄Web
- Python學習之常用模組Python
- Python學習之 datetime模組Python
- Python的shutil zipfile tarfile模組學習Python
- git 不同目錄用不同的配置Git
- fs模組之刪除目錄
- python基礎學習16—-模組Python
- Python學習之模組與包Python
- redis學習——目錄Redis
- Flutter學習目錄Flutter
- react學習目錄React
- python開發學習之如何更好的引用Python模組?Python
- Python開發常用的庫及模組!Python學習教程Python
- Python學習之如何引用Python自定義模組?Python
- 深度學習——學習目錄——學習中……深度學習
- [Python]學習基礎篇:檔案和目錄Python
- retrying模組的學習
- 模組學習之hashlib模組
- 模組學習之logging模組
- Python–logging模組不同級別寫入到不同檔案Python
- Spring Boot 學習目錄Spring Boot
- 【機器學習】目錄機器學習