1. 程式人生 > 其它 >python import與相對路徑

python import與相對路徑

前言:又是弄視訊分割的這個專案,被裡面的路徑搞瘋了,一直報錯。其實以前也遇到過路徑相關的問題,但是隨便折騰下,問題也就解決了,所以一直懶得去仔細鑽研這問題。

本文會探討兩類問題,一是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的用法