1. 程式人生 > 其它 >不同目錄間模組呼叫

不同目錄間模組呼叫

一、背景

  不同目錄間模組呼叫,這就不得不說兩個概念:絕對路徑和相對路徑。

二、函式功能解釋

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'這一層,其他的層級無法呼叫。那怎麼辦吶?

步驟如下:

  1. 獲取Atm的絕對路徑
  2. 新增到環境變數中

程式碼如下:

#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