python import與相對路徑
阿新 • • 發佈:2021-04-28
前言:又是弄視訊分割的這個專案,被裡面的路徑搞瘋了,一直報錯。其實以前也遇到過路徑相關的問題,但是隨便折騰下,問題也就解決了,所以一直懶得去仔細鑽研這問題。
本文會探討兩類問題,一是import,二是相對路徑。均基於python3(更新中,自己也還在學習)。
pathProject
- src
-- main.py
-- package1
--- p1.py
-- package2
--- p2.py
--- p2_1.py
下面是針對自己的疑問,進行實驗的結果
Q1:在pathProject下執行python src/main.py
與pathProject/src下執行python main.py
的區別?
A1:
首先,對於import來說,只與被執行檔案所在的目錄有關,上面兩種方式產生的結果都是將pathProject/src加入sys.path中(參考實驗1程式碼;
其次,對於相對路徑來說,則與當前的所在目錄有關,在pathProject下執行python src/main.py
,無論哪個檔案中,相對路徑都是基於pathProject,在pathProject/src下執行python main.py
,相對路徑都是基於pathProject/src(參考實驗2程式碼)。
實驗1
"""
p2.py
"""
import sys
print (sys.path)
實驗結果
實驗2
"""
p2.py
"""
import os
print(os.path.abspath('.'))
"""
main.py
"""
from package2 import p2
if __name__ == '__main__':
print('main')
Q2:如何在p2.py中引入p1.py?
A2:這取決於被執行的檔案目錄,如同第一個問題一樣,import的原理就是通過sys.path檢查搜尋路徑,若當前位於src內,那麼在p2.py中寫from package1 import p1
python package2/p2.py
,則會報錯,因為sys.path中包含的路徑是src/package2,沒有package1的搜尋路徑;反之,若在src內,執行
python main.py
,則不會報錯,因為sys.path內包含src,也就是囊括了package1所在路徑。(ps: pycharm會自動將一些路徑加入sys.path,此處不考慮這種情況,本文所有實驗均基於vscode)
Q3:如何在p2.py中引入p2_1.py?
A3: 若直接在p2.py中寫import p2_1
,然後位於執行python main.py
會報錯,因為搜尋路徑並不能囊括進p2_1.py,需要寫成from . import p2_1
才行。
此處參考知乎回答:python中import的用法