day4-不同目錄間模塊的調用


1.前言

上文已經講述了軟件項目開發目錄規范的若干事項,現在問題來了,我們遵循了項目目錄設計規范,不同目錄下設計了不同的函數和模塊,怎么實現對這些模塊的調用,使其為項目整體所用呢?本章節講述的絕對路徑與相對路徑,以及不同目錄間模塊如何調用將回答這個問題。


2.重要功能函數

  1. __file__
    功能:返回文件自身所在的路徑。
    請注意我們我們一般通過print(__file__)來返回獲得當前文件所在的路徑,但是不能直接在命令行下以交互的方式來使用它,必須定義在一個保存好的py文件中后去執行它
    image
    命令行下直接使用print(__file__)報錯了!

    另外
    這里的路徑究竟是絕對路徑還是相對路徑呢?答案是兩個都不是,取決於執行時傳遞給python的文件形式,如果以相對路徑的形式傳遞給python執行,那么就返回相對路徑,反之則返回絕對路徑。
      1 #  D:/python/S13/Day5/test/bin/test.py 代碼
      2 print(__file__)
      3 
      4 
      5 # Pycharm執行結果
      6 "C:\Program Files (x86)\python3.6.1\python.exe" D:/python/S13/Day5/test/bin/test.py
      7 D:/python/S13/Day5/test/bin/test.py
      8 
      9 # CMD執行結果
     10 D:\python\S13\Day5\test\bin>python D:/python/S13/Day5/test/bin/test.py  #在文件所在路徑下以絕對路徑方式傳入文件,返回的仍然是絕對路徑
     11 D:/python/S13/Day5/test/bin/test.py
     12 D:\python\S13\Day5\test\bin>cd ..
     13 D:\python\S13\Day5\test>python D:/python/S13/Day5/test/bin/test.py
     14 D:/python/S13/Day5/test/bin/test.py
     15 D:\python\S13\Day5\test>cd ..
     16 D:\python\S13\Day5>python test/bin/test.py #只有以相對路徑形式傳入文件,才能返回相對路徑
     17 test/bin/test.py
  2. os.path.dirname(file)
    功能:返回給定參數文件所在的目錄(路徑)。
    注意返回的路徑是相對路徑還是絕對路徑取決於傳遞的參數形式,如果以絕對路徑形式傳入參數文件,則返回絕對路徑,反之則返回相對路徑
      1 >>> print(os.path.abspath('.'))
      2 D:\python\S13\Day5
      3 >>> print(os.path.dirname('test/bin/test.py'))
      4 test/bin
      5 >>> print(os.path.dirname('D:/python/S13/Day5/test/bin/test.py'))
      6 D:/python/S13/Day5/test/bin
      7 
      8 #Pycharm中執行結果相同
      9 #D:/python/S13/Day5/test/bin/test.py代碼
     10 import os
     11 print(os.path.dirname(os.path.abspath(__file__)))
     12 
     13 #執行結果
     14 "C:\Program Files (x86)\python3.6.1\python.exe" D:/python/S13/Day5/test/bin/test.py
     15 D:\python\S13\Day5\test\bin
     16 
  3. os.path.abspath(file)
    功能:返回文件對象的絕對路徑(包含文件本身在內)

      1 #test.py代碼
      2 import os
      3 print(os.path.abspath(__file__))
      4 
      5 #cmd下執行結果
      6 D:\python\S13>python day5/test/bin/test.py
      7 D:\python\S13\day5\test\bin\test.py
  4. sys.path
    功能:返回python當前可執行的環境變量
      1 import sys
      2 print(sys.path)
      3 
      4 D:\python\S13>python day5/test/bin/test.py
      5 ['D:\\python\\S13\\day5\\test\\bin', 'C:\\Program Files (x86)\\python3.6.1\\pyth
      6 on36.zip', 'C:\\Program Files (x86)\\python3.6.1\\DLLs', 'C:\\Program Files (x86
      7 )\\python3.6.1\\lib', 'C:\\Program Files (x86)\\python3.6.1', 'C:\\Program Files
      8  (x86)\\python3.6.1\\lib\\site-packages']
      9 

3. 絕對路徑與相對路徑

  • 絕對路徑
    絕對路徑是相當於根目錄而言描述了文件對象完整的路徑,在任何路徑下通過絕對路徑一定可以找到該文件。
      1 >>> import os
      2 >>> os.chdir('D:\\python\\S13\\Day5\\test\\bin')
      3 >>> os.listdir()
      4 ['test.py']
      5 >>> os.path.abspath('test.py')
      6 'D:\\python\\S13\\Day5\\test\\bin\\test.py'
      7 >>>
  • 相對路徑
    相對路徑是相對於一個特定的非根目錄而言來描述文件的路勁的,只有在該指定的參考文件目錄下通過相對路徑才可以訪問到該文件。
      1 >>> import os
      2 >>> os.chdir('D:\\python\\S13\\Day5')
      3 >>> os.path.dirname('test/bin/test.py')
      4 'test/bin'  #返回的路徑是相對於當前所在目錄而言的非完整路徑

4. 不同目錄間模塊如何調用

有了以上基礎知識的鋪墊,就可以實現不同目錄間模塊的調用了,其實現的思路是先通過上述多個函數把項目根目錄獲取到,然后追加到系統環境變量中,最后from不同路徑import模塊。

為什么要先解決系統環境變量問題呢?這是因為相對於項目而言,默認的PATH只深入到被執行的python文件所在的目錄這一層。

  1 #test.py代碼
  2 import sys
  3 print(sys.path)
  4 D:\python\S13>python D:\python\S13\Day5\test\bin\test.py
  5    ['D:\\python\\S13\\Day5\\test\\bin', 'C:\\Program Files (x86)\\python3.6.1\\pyth
  6    on36.zip', 'C:\\Program Files (x86)\\python3.6.1\\DLLs', 'C:\\Program Files (x86
  7    )\\python3.6.1\\lib', 'C:\\Program Files (x86)\\python3.6.1', 'C:\\Program Files
  8     (x86)\\python3.6.1\\lib\\site-packages']
  9 #請注意返回的PATH中,只有列表的第一個元素跟項目本身有關,而且只深入到test.py所在的這一層目錄,其它的元素均為python自身默認的環境變量
 10 

因此只能從sys.path返回的列表第一個元素上着手,把項目的根目錄追加到PATH中,這樣才能方便調用項目中任何目錄下的模塊。
下面通過一個直觀的栗子來實踐一下。

先截圖說明下項目目錄結構:

image
項目的根目錄是test這一級,假設test.py是我的入口文件。

test.py代碼如下:

  1 import os,sys
  2 
  3 
  4 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #這里先通過os.path.abspath獲取入口文件所在的絕對路徑,然后通過兩次調用os.path.dirname函數獲取到項目根目錄
  5 sys.path.append(BASE_DIR) #把系統根目錄追加到環境變量中
  6 
  7 from conf import settings
  8 settings.check_path()
  9 
 10 from core import main
 11 main.sayhi()

conf/settings.py代碼如下,用於檢測環境變量是否正確:

  1 import os,sys
  2 
  3 SYS_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  4 
  5 def check_path():
  6     print("Let's begin to check the current PATH")
  7     if SYS_PATH in sys.path:
  8         print('Check PATH OK!')
  9     else:
 10         exit('Check PATH error,the program is exiting...')

core/main.py包含了需要執行的主要功能模塊,代碼如下:

  1 def sayhi():
  2     print('Hello world!')

執行test.py的結果如下:

  1 "C:\Program Files (x86)\python3.6.1\python.exe" D:/python/S13/Day5/test/bin/test.py
  2 Let's begin to check the current PATH
  3 Check PATH OK!
  4 Hello world!

可以看到我們獲得了預期的效果,成功實現了對其他目錄下模塊的調用。


免責聲明!

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



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