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


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

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

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

