Python工具腳本如何調(diào)用外層模塊
我三年前寫(xiě)過(guò)一篇文章:《小問(wèn)題大隱患:如何正確設(shè)置 Python 項(xiàng)目的入口文件?》。講到Python項(xiàng)目應(yīng)該如何正確組織代碼結(jié)構(gòu)。入口文件應(yīng)該在最外面,調(diào)用關(guān)系應(yīng)該是從外向內(nèi)調(diào)用。絕對(duì)不能學(xué)Java,從一個(gè)很深層的文件夾里面往外調(diào)用。
不過(guò)我在這篇文章的最后,也提到了一種例外情況,那就是工具腳本不受這個(gè)規(guī)則的限制。如下圖所示。

今天有同學(xué)在問(wèn)我,這種情況應(yīng)該怎么調(diào)用,才能讓remove_outdated_data.py正確導(dǎo)入models里面的模塊。我們就來(lái)說(shuō)明一下。
首先,我們來(lái)創(chuàng)建一個(gè)示例程序,結(jié)構(gòu)如下圖所示:
其中,aa.py文件的內(nèi)容為:
def i_am_func():
print('我是一個(gè)函數(shù)')
test.py文件的內(nèi)容為:
from models.aa import i_am_func
i_am_func()
那么,不修改任何環(huán)境變量,也不修改sys.path的情況下,我應(yīng)該怎么運(yùn)行test.py,才能讓它正確調(diào)用i_am_func函數(shù)?
首先我們進(jìn)入tools文件夾運(yùn)行,顯然會(huì)報(bào)錯(cuò),如下圖所示:
接下來(lái),我們?cè)陧?xiàng)目根目錄下面運(yùn)行,也會(huì)報(bào)錯(cuò):
那應(yīng)該怎么辦呢?難道必須加環(huán)境變量或者改sys.path?
其實(shí),Python已經(jīng)自帶了正確運(yùn)行工具腳本的方法,就是-m參數(shù)。我們只需要在項(xiàng)目根目錄執(zhí)行下面這個(gè)命令就可以了:
python -m tools.test
如下圖所示:
如果工具腳本在很深的文件夾里面,那么路徑只需要使用點(diǎn)分割就可以了。例如下面的文件結(jié)構(gòu):
要運(yùn)行second.py,那么命令就寫(xiě)成:
python -m tools.deep.folder.second
如果你的工具腳本有參數(shù),也可以正常添加,例如:
python -m tools.deep.folder.second args1 args2
往期回顧
2、終于!淘寶能用微信支付了:不跳轉(zhuǎn),直接付!
3、推薦 3 個(gè)火火火火火的 GitHub 項(xiàng)目
4、 這個(gè)瀏覽器,想必只有開(kāi)發(fā)者才會(huì)用吧?
5、拍視頻每月花 2800 萬(wàn),B 站新來(lái)的 UP 主有“億”點(diǎn)強(qiáng)
點(diǎn)擊關(guān)注公眾號(hào),閱讀更多精彩內(nèi)容

