1. 程式人生 > 程式設計 >Python匯入父資料夾中模組並讀取當前資料夾內的資源

Python匯入父資料夾中模組並讀取當前資料夾內的資源

在某些特殊情況下,我們的 Python 指令碼需要呼叫父目錄下的其他模組。例如:

Python匯入父資料夾中模組並讀取當前資料夾內的資源

在編寫 GNE 的測試用例時,有一個指令碼 generate_new_cases.py放在 tests資料夾中。而 tests 資料夾與 gne 資料夾放在同一個位置。其中 gne 資料夾是一個包。我現在需要從generate_new_cases.py 檔案中匯入 gne 裡面的一個類GeneralNewsExtractor。

為了簡化問題,我單獨寫了一個演示的樣例。它的檔案結構與每個檔案中的內容如下:

Python匯入父資料夾中模組並讀取當前資料夾內的資源

現在,我直接在 scripts 資料夾裡面執行run.py會報錯,提示從包的最頂層之外相對匯入。

現在,我們改一下程式碼,嘗試在scripts 資料夾的父資料夾中執行程式碼,發現還是會報錯:

Python匯入父資料夾中模組並讀取當前資料夾內的資源

我們再來改一下程式碼,在 scripts 資料夾中,把父資料夾加入到sys.path中:

import sys
sys.path.append('..')

執行效果如下圖所示:

Python匯入父資料夾中模組並讀取當前資料夾內的資源

這種寫法,當我們在scripts 資料夾裡面執行run.py時,確實已經正常了。但是如果我們在scripts資料夾的父資料夾再執行程式碼,又不對了,如下圖所示:

Python匯入父資料夾中模組並讀取當前資料夾內的資源

為了檢查這個原因,我們列印一下sys.path:

Python匯入父資料夾中模組並讀取當前資料夾內的資源

大家有沒有發現一個很不和諧的東西:其他路徑都是絕對路徑,就最後我們加了兩個點看起來很違和。那如果我們把這兩個點換成絕對路徑呢?於是嘗試獲取當前正在執行的這個檔案的絕對路徑:

import sys
from pathlib import Path
current_folder = Path(__file__).absolute().parent
father_folder = str(current_folder.parent)
sys.path.append(father_folder)

執行效果如下圖所示:

Python匯入父資料夾中模組並讀取當前資料夾內的資源

匯入模組已經正常了,但是讀取資原始檔又異常了。

這是因為,import匯入模組時,是根據sys.path中的路徑來尋找的。但是讀取資原始檔的時候,相對檔案路徑是相對於工作區來尋找的。

現在我們在~/test_import_father_module執行python3 scripts/run.py,那麼當前的工作區就是~/test_import_father_module。而由於資原始檔是在scripts資料夾中的,所以就找不到。

所以我們還需要修改一下工作區:

import os
from pathlib import Path
current_folder = Path(__file__).absolute().parent
os.chdir(str(current_folder))

執行效果如下圖所示:

Python匯入父資料夾中模組並讀取當前資料夾內的資源

現在無論是讀取資原始檔還是匯入模組,都已經正常了。

我們再回到 scripts 資料夾中執行看看:

Python匯入父資料夾中模組並讀取當前資料夾內的資源

發現也能正常執行。

總結

涉及到模組匯入相關的環境,可以通過在sys.path新增絕對路徑來解決。涉及到讀取資原始檔的相關環境,可以通過使用os.chdir修改工作區為另一個絕對路徑來解決。

到此這篇關於Python匯入父資料夾中模組並讀取當前資料夾內資源的文章就介紹到這了,更多相關Python匯入父資料夾模組並讀取資源內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!