不一樣目錄間進行模塊調用

1、背景

  以前寫了軟件開發目錄規範這篇博客,相信不少人都已經知道,咱們在寫程序時須要遵循必定的規範,否則,就算很簡答的邏輯程序的代碼,讀起來會很費勁,佔用了咱們大量的時間,可是,咱們一旦用了這樣的規範目錄,咱們怎麼去愉快的進行模塊以前的相互導入呢?這就不得不說咱們今天討論的兩個概念:絕對路徑和相對路徑。python

2、函數功能解釋

一、__file__app

功能:返回自身文件的相對路徑函數

#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__表示的是相對路徑,因此在哪一個路徑下,就打印哪一個路徑。spa

二、os.path.abs()code

功能:返回自身文件的絕對路徑blog

#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的絕對路徑

三、os.path.dirname()ip

功能:返回目錄名,不須要文件名開發

#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  #只返回目錄名,不須要文件名

四、sys.pathpycharm

功能:python環境的執行的環境變量cmd

#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數據類型是一個列表。

3、絕對路徑和相對路徑

一、絕對路徑

絕對路徑:從根目錄爲起點到你所在的目錄。

>>> 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盤的這個根目錄下來的

二、相對路徑

相對路徑:從一個目錄爲起點到你所在的目錄。

>>> import os
>>> os.chdir("D:\\PycharmProjects\\51homework\\Atm\\bin\\")
>>> os.listdir()
['atm.py', '__init__.py']
>>> os.path.dirname('atm.py')
''   #顯示相對路徑

4、不一樣目錄間進行模塊調用

一、添加環境變量

通常狀況下,絕對路勁函數和相對路徑函數是結合起來用的,特別是在不一樣目錄之間相互調用彼此的模塊。

好比按以上層級: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的絕對路徑已經添加到環境變量中

二、調用其餘模塊

接下來就能夠順利的進行不一樣目錄下,模塊之間的調用了

#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
相關文章
相關標籤/搜索