慕標(biāo)琳琳
2023-02-07 14:55:08
我制作了一個(gè)包含很多包和模塊的應(yīng)用程序。我正在開發(fā)這些包(在它們的目錄中),并且由于我在包目錄中執(zhí)行文件,因此模塊/包的導(dǎo)入路徑發(fā)生了變化。例如,該項(xiàng)目看起來有點(diǎn)像這樣......├── app.py└── utils ├── database.py └── robot ├── __init__.py ├── run.py ├── recognition.py └── housekeeping.py如果我執(zhí)行python3 app.py則import utils.database有效。但是,如果我在包中運(yùn)行python3 run.py則無效。import utils.database我想知道如何執(zhí)行函數(shù)并導(dǎo)入模塊/包而不會(huì)出錯(cuò)。我有這個(gè)工作,但我認(rèn)為這是不對(duì)的。到目前為止,我已經(jīng)嘗試__name__ == "__main__"在每個(gè)主.py文件中使用 using 和 using sys.path.append,但我覺得必須有一種更簡(jiǎn)單、更好看的方法。這就是里面的run.py樣子,我也必須在里面做同樣的事情database.py,這是最好的方法嗎?if __name__ == "__main__": import sys sys.path.append('../../')from utils.robot.recognition import *from utils.robot.housekeeping import *import utils.database as db
1 回答

長(zhǎng)風(fēng)秋雁
TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊
將$PYTHONPATH
環(huán)境變量設(shè)置為包含 的目錄utils
,然后您的導(dǎo)入將起作用。
切勿直接運(yùn)行包中包含的模塊。如果同樣直接運(yùn)行,也可以從包中導(dǎo)入,這是有問題的,因?yàn)檫@樣在解釋器中就會(huì)有模塊的兩個(gè)副本,這肯定會(huì)造成混淆。
相反,使用-m
解釋器選項(xiàng):
python -m utils.robot.run
或者,如果您永遠(yuǎn)不需要從其他模塊導(dǎo)入 run.py,則可以從包中完全刪除該文件并將其保存在單獨(dú)的“腳本”目錄中,然后您就不需要使用-m
. 但是您仍然需要設(shè)置 sys.path,或者$PYTHONPATH
像以前一樣使用,或者通過執(zhí)行 sys.path 操作。如果您選擇執(zhí)行 sys.path 操作,那么無論當(dāng)前工作目錄是什么,您都應(yīng)該讓它工作:
sys.path.append(os.path.join(os.path.dirname(__file__), '../../'))
添加回答
舉報(bào)
0/150
提交
取消