您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“怎么正確設(shè)置Python項(xiàng)目的入口文件”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
有一位同學(xué)提到了 Python 找不到模塊的問題:
問題涉及到的代碼結(jié)構(gòu)和代碼截圖如下:
這個(gè)問題的解決方法非常簡單,就是把start.py文件從bin文件夾移出來就好了。
但如果對這個(gè)問題進(jìn)一步分析,可以看到更多問題。
在我以前的文章:為什么Python代碼能運(yùn)行但是PyCharm給我畫紅線?中,我講到了工作區(qū)(Workdir)對代碼的影響。PyCharm、VSCode 識(shí)別的工作區(qū),可能并不等于你直接在終端窗口運(yùn)行.py文件時(shí)候的工作區(qū)。
今天這個(gè)問題本質(zhì)上也是工作區(qū)導(dǎo)致的問題。這個(gè)同學(xué)的項(xiàng)目根目錄是MY_API,所以他使用的編輯器VSCode 就會(huì)默認(rèn)把MY_API當(dāng)做工作區(qū)。所以,當(dāng)他在start.py文件中寫上from lib.interface import server時(shí),VScode 并不會(huì)給他標(biāo)記紅色波浪線。因?yàn)閺?VSCode 的視角看,lib文件夾確實(shí)就是在工作區(qū)下面的。
但是,當(dāng)他在 VSCode 里面運(yùn)行這個(gè)start.py文件時(shí),Python 是從bin文件夾下面運(yùn)行的。此時(shí),Python 會(huì)把bin文件夾當(dāng)做工作區(qū)。在工作區(qū)里面就只有這一個(gè)start.py文件,所以當(dāng)然找不到lib文件夾。
如果僅僅從技術(shù)上來說,你非要導(dǎo)入 bin 文件夾的父文件夾下面的其他模塊,也并不困難,我在一日一技:導(dǎo)入父文件夾中的模塊并讀取當(dāng)前文件夾內(nèi)的資源一文中講到了具體的做法。
但問題在于,你不應(yīng)該這樣做。你不應(yīng)該把項(xiàng)目的入口文件,放到項(xiàng)目內(nèi)部很深的文件夾中。
所謂入口文件,就是要首先經(jīng)過它,才能到達(dá)其他的文件。當(dāng)你拿到一個(gè) Python 項(xiàng)目,你只需要首先從入口文件開始閱讀代碼,根據(jù)入口文件調(diào)用的模塊,一路看下去,你就能讀到它的所有實(shí)現(xiàn)邏輯。
但如果大家經(jīng)常逛 Github,就會(huì)發(fā)現(xiàn),有些人可能是被其他垃圾語言污染了思想,他的 Python 項(xiàng)目,根目錄有五六個(gè)文件夾和七八個(gè).py文件。你拿到這個(gè)項(xiàng)目的時(shí)候,你甚至不知道,當(dāng)你想運(yùn)行這個(gè)代碼的時(shí)候,python3 xxx.py應(yīng)該運(yùn)行哪個(gè)文件。你多方打聽,或者看了半天文檔,才知道,哦,原來入口文件在com/xx/yy/zz/script/run.py。
當(dāng)你打開這個(gè)run.py文件,你發(fā)現(xiàn)它的頂部,文件導(dǎo)入的代碼寫的是from ../../../../aaa import bbb。
簡直是神經(jīng)病寫法。我知道有些垃圾語言流行這樣寫。但現(xiàn)在你用的是 Python,學(xué)聰明一點(diǎn),別那樣寫。
對于一個(gè) Python 項(xiàng)目來說,入口文件應(yīng)該始終在最外層。例如:
當(dāng)你要啟動(dòng)這個(gè)項(xiàng)目的時(shí)候,直接在最外層python3 main.py,就能把它啟動(dòng)起來。在main.py里面,你可以導(dǎo)入其他模塊,然后調(diào)用其他模塊里面的類或者函數(shù)。
這樣做的好處是什么?這樣做,你是在項(xiàng)目的根目錄啟動(dòng)的這個(gè)項(xiàng)目,所以你的工作區(qū)就是項(xiàng)目的根目錄。那么你在任何一個(gè).py文件里面都可以很容易地基于工作區(qū)導(dǎo)入任意其他文件。例如,你現(xiàn)在在models/mongo-util/mongob_helper.py文件中,你想導(dǎo)入utils/abc.py中的time_format()函數(shù),那么,你只需要這樣寫就可以了。
from utils.abc import time_format
你根本不可能出現(xiàn)需要導(dǎo)入父文件夾中的某個(gè)模塊的情況。
只有工具腳本,才需要單獨(dú)使用一個(gè)文件夾來存放,然后調(diào)用父文件夾中的其他文件。例如,我現(xiàn)在有一個(gè)工具腳本,它每天晚上0點(diǎn)會(huì)讀寫 MongoDB,清理無效數(shù)據(jù),那么此時(shí),我可以在根目錄單獨(dú)創(chuàng)建一個(gè)script或tools或者bin文件夾,然后把工具腳本放進(jìn)去,例如:
在這個(gè)工具腳本里面,你可能會(huì)調(diào)用models/mongo-util/mongob_helper.py文件中的某個(gè)函數(shù)。這種情況下,你調(diào)用父文件夾中的內(nèi)容是可以接受的。但這畢竟只是工具腳本。
可能還有同學(xué)要問,那如果我的項(xiàng)目是一個(gè) Python 的包,它本身沒有入口文件怎么辦呢?這個(gè)時(shí)候,你可以把這個(gè)包的__init__.py當(dāng)做它的入口文件。大家可以參考我在 GitHub - kingname/GeneralNewsExtractor: 新聞網(wǎng)頁正文通用抽取器 Beta 版.[1]的代碼組織結(jié)構(gòu)。在項(xiàng)目根目錄留下一個(gè)example.py文件,用來演示如何調(diào)用這個(gè)包。而這個(gè)包本身的代碼,是在一個(gè)叫做gne的文件夾中的。這個(gè)gne文件夾是一個(gè)包,它的入口文件在__init__.py中。
各位,當(dāng)你寫代碼的時(shí)候,你先想一想,如果別人拿到了你的代碼,想要梳理一下這個(gè)項(xiàng)目的邏輯,在不詢問你的情況下,怎么讓他知道應(yīng)該從哪個(gè)文件開始讀?應(yīng)該按什么順序讀?他能不能輕易地看到數(shù)據(jù)在你的代碼中是怎么運(yùn)轉(zhuǎn)的?
“怎么正確設(shè)置Python項(xiàng)目的入口文件”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。