不同目錄間模組呼叫
阿新 • • 發佈:2021-07-09
一、背景
不同目錄間模組呼叫,這就不得不說兩個概念:絕對路徑和相對路徑。
二、函式功能解釋
1、__file__
功能:返回自身檔案的相對路徑
#atm.py中的程式碼 print(__file__) #pycharm的執行結果 D:\Python\Python35\python.exe D:/PycharmProjects/51homework/Atm/bin/atm.py D:/PycharmProjects/51homework/Atm/bin/atm.py #打印出絕對路徑 #從cmd執行atm.py D:\PycharmProjects\51homework>python Atm/bin/atm.py Atm/bin/atm.py #列印的是相對路徑
從上面看,為什麼pycharm中執行的結果是絕對路徑,而從cmd呼叫python命令時顯示的卻是相對路徑?你從pycharm的執行結果可以看出,在pycharm執行atm.py檔案時,是從絕對路徑下去執行的,而你從cmd下去執行的時候,是你選擇可以在哪個路徑下執行,而__file__表示的是相對路徑,所以在哪個路徑下,就列印哪個路徑。
2、os.path.abs()
功能:返回自身檔案的絕對路徑
#atm.py的檔案程式碼 import os print(os.path.abspath(__file__)) #在cmd中的執行結果 D:\PycharmProjects\51homework>python Atm/bin/atm.py D:\PycharmProjects\51homework\Atm\bin\atm.py #獲取atm.py的絕對路徑
3、os.path.dirname()
功能:返回目錄名,不需要檔名
#atm.py的檔案程式碼 import os print(os.path.dirname( os.path.abspath(__file__) )) #在cmd中的執行結果 D:\PycharmProjects\51homework>python Atm/bin/atm.py D:\PycharmProjects\51homework\Atm\bin #只返回目錄名,不需要檔名
4、sys.path
功能:python環境的執行的環境變數
#atm.py中的程式碼 import sys print(sys.path) #cmd執行的結果 D:\PycharmProjects\51homework>python Atm/bin/atm.py ['D:\\PycharmProjects\\51homework\\Atm\\bin', 'D:\\Python\\Python35\\python35.zip', 'D:\\Python\\Python35\\DLLs', 'D:\\Python\\Python35\\lib', 'D:\\Python\\Python35', 'D:\\Python\\Python35\\lib\\site-packages']
注:執行路徑是列表的形式打印出來的,所以sys.path資料型別是一個列表。
三、絕對路徑和相對路徑
1、絕對路徑
絕對路徑:從根目錄為起點到你所在的目錄。
>>> import os >>> os.chdir("D:\\PycharmProjects\\51homework\\Atm\\bin\\") >>> os.listdir() ['atm.py', '__init__.py'] >>> os.path.abspath('atm.py') 'D:\\PycharmProjects\\51homework\\Atm\\bin\\atm.py' #是從D盤的這個根目錄下來的
2、相對路徑
相對路徑:從一個目錄為起點到你所在的目錄。
>>> import os >>> os.chdir("D:\\PycharmProjects\\51homework\\Atm\\bin\\") >>> os.listdir() ['atm.py', '__init__.py'] >>> os.path.dirname('atm.py') '' #顯示相對路徑
四、不同目錄間進行模組呼叫
1、新增環境變數
一般情況下,絕對路勁函式和相對路徑函式是結合起來用的,特別是在不同目錄之間相互呼叫彼此的模組。
比如按以上層級:atm.py如果想呼叫其他模組中的程式碼,必須要跟atm.py是同級的,不信請看如下程式碼:
#atm.py中的程式碼 import sys print(sys.path) #cmd執行的結果 D:\PycharmProjects\51homework>python Atm/bin/atm.py ['D:\\PycharmProjects\\51homework\\Atm\\bin', 'D:\\Python\\Python35\\python35.zip', 'D:\\Python\\Python35\\DLLs', 'D:\\Python\\Python35\\lib', 'D:\\Python\\Python35', 'D:\\Python\\Python35\\lib\\site-packages']
只到'D:\\PycharmProjects\\51homework\\Atm\\bin'這一層,其他的層級無法呼叫。那怎麼辦吶?
步驟如下:
- 獲取Atm的絕對路徑
- 新增到環境變數中
程式碼如下:
#atm.py中的程式碼 import os,sys BASE_DIR = os.path.dirname( os.path.dirname( os.path.abspath(__file__) ) ) #Atm的絕對路徑 print(BASE_DIR) sys.path.append(BASE_DIR) #新增到環境變數中 print(sys.path) #cmd執行結果 D:\PycharmProjects\51homework>python Atm/bin/atm.py #執行atm.py檔案 D:\PycharmProjects\51homework\Atm #列印Atm的絕對路徑 ['D:\\PycharmProjects\\51homework\\Atm\\bin', 'D:\\Python\\Python35\\python35.zip', 'D:\\Python\\Python35\\DLLs', 'D:\\Python\\Python35\\lib', 'D:\\Python\\Python35', 'D:\\Python\\Python35\\lib\\site-packages', 'D:\\PycharmProjects\\51homework\\Atm'] #Atm的絕對路徑已經新增到環境變數中
2、呼叫其他模組
接下來就可以順利的進行不同目錄下,模組之間的呼叫了
#atm.py中的程式碼 import os,sys BASE_DIR = os.path.dirname( os.path.dirname( os.path.abspath(__file__) ) ) sys.path.append(BASE_DIR) from core import main #呼叫core中的main模組 main.sayhi() #呼叫main模組中sayhi函式 #main.py中程式碼 def sayhi(): print("hello word") #cmd執行的結果 D:\PycharmProjects\51homework>python Atm/bin/atm.py hello word
本文來自部落格園,作者:ReluStarry,轉載請註明原文連結:https://www.cnblogs.com/relustarry/p/14990685.html