Python導(dǎo)入其他路徑下的文件報錯的問題及解決
1. 代碼結(jié)構(gòu)
如下兩圖所示,當前代碼文件分別有三個:
test.py dir_a.py dir_b.py,其中主代碼為test.py,該文件在主目錄test文件夾下,dir_a.py dir_b.py在和test.py同級的DIR文件夾下。
其中test.py導(dǎo)入了DIR文件夾中的dir_a.py文件,而dir_a.py文件導(dǎo)入了同目錄下的dir_b.py文件。


2. 錯誤的示例
2.1 我一開始的導(dǎo)入代碼如下
test.py的導(dǎo)入代碼部分:
# test.py from DIR import dir_a
dir_a.py文件導(dǎo)入dir_b.py的代碼部分:
# dir_a.py import dir_b
這樣的結(jié)果是,運行dir_a.py文件是沒問題的,但是運行test.py時就會報錯:ModuleNotFoundError: No module named 'dir_b',應(yīng)該是找不到 dir_b.py文件。
其實這就是使用相對路徑導(dǎo)入模塊產(chǎn)生的問題,把相對路徑改為絕對路徑就行了。
注意絕對路徑一定是要從當前環(huán)境的跟目錄開始! 或者可以把dir_a.py dir_b.py文件所在的絕對路徑添加到sys.path中。
2.2 將路徑添加到sys.path中(打包不成功)
我在網(wǎng)絡(luò)上查了好久,產(chǎn)生上面的問題是當前sys.path中缺少了DIR文件夾路徑的問題,可以給添上,將test.py的導(dǎo)入代碼部分修改為如下:
# test.py
import sys
sys.path.append('DIR')
from DIR import dir_a
修改完之后確實不會報錯了,但是使用pyinstaller和Nuitka打包后,一樣還是會報錯,如下圖,錯誤原因還是找你到dir_b

錯誤原因分析:
之所以打包后會出現(xiàn)錯誤,經(jīng)過我的實驗發(fā)現(xiàn),pyinstaller沒有把dir_b.py文件給打包進去,不知道為啥會出現(xiàn)這種情況,有知道的可以評論告訴我下。
2.3 使用絕對路徑
網(wǎng)絡(luò)上有另一種方案就是只修改dir_a.py文件中的內(nèi)容,修改后的dir_a.py中的導(dǎo)入部分代碼:
# dir_a.py
if __package__ is None or __package__ == '':
# uses current directory visibility
import dir_b
else:
# uses current package visibility
from . import dir_b
這樣再運行代碼dir_a.py test.py都不會有問題,而且打包后也不會報錯。但是這樣代碼太臃腫了,建議使用2.4的方案
2.4 終極解決方案
只修改dir_a.py文件中引入模塊的部分,修改為:
# dir_a.py from DIR import dir_b
這樣再運行代碼dir_a.py test.py都不會有問題。
注意:
其實這里有一個很重要的點,就是絕對路徑一定要從當前環(huán)境的根目錄開始算。上面的寫法默認test文件夾就是當前環(huán)境的根目錄,這樣的話是沒問題的。但是假如test文件夾的上一級文件夾MyProj才是編譯環(huán)境的根目錄時(如下圖),運行test.py不會報錯,但是運行dir_a.py是會報錯的。
這時候dir_a.py文件中就應(yīng)該這樣改:from test.DIR import dir_b

總結(jié)
代碼書寫時最好是代碼都在一個目錄下,這樣就不會出現(xiàn)上面的問題了。如果必須要用的話,一定要注意模塊導(dǎo)入問題,修改成本文提出的方式。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Flask創(chuàng)建并運行數(shù)據(jù)庫遷移的實現(xiàn)過程
Flask創(chuàng)建并運行數(shù)據(jù)庫遷移的過程是一個涉及多個步驟的操作,旨在幫助開發(fā)者在開發(fā)過程中管理數(shù)據(jù)庫模式的變化,而不需要手動地刪除和重建數(shù)據(jù)庫表,從而避免數(shù)據(jù)丟失,以下是一個詳細的步驟說明,需要的朋友可以參考下2024-09-09
Python使用Selenium實現(xiàn)模擬登錄的示例代碼
Selenium(本文基于python3.8)是一個功能強大的自動化測試工具,它可以用于模擬用戶在瀏覽器中的行為,比如點擊、輸入、滾動等等,本教程將詳細介紹如何使用Python編寫一個模擬登錄地爬蟲,使用XPath等多種元素匹配方法,需要的朋友可以參考下2023-08-08
python實現(xiàn)同級目錄調(diào)用的示例詳解
同級目錄指的是位于同一級別的文件夾,這些文件夾具有相同的層級結(jié)構(gòu),它們相互平行,沒有一個被包含在另一個之中,本文將給大家介紹python實現(xiàn)同級目錄調(diào)用的示例,需要的朋友可以參考下2024-06-06
10行Python代碼計算汽車數(shù)量的實現(xiàn)方法
這篇文章主要介紹了10行Python代碼計算汽車數(shù)量的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10

