最近,好多事阳谍,新學(xué)期課又是出奇的多蛀柴,于是我就好久沒更新了,今天周末矫夯,我決定將最近的學(xué)習(xí)所得整理一下鸽疾,POST上來。
首先是茧痒,最近一直在做有關(guān)web開發(fā)的事肮韧,所以最近幾篇主要關(guān)于django框架的使用,以及python的一些奇淫技巧旺订,而后弄企,我會將SVM的文章更新上來(真是不務(wù)正業(yè)啊,哈哈哈)
什么是搜索路徑
其實(shí)区拳,但凡學(xué)過C語言拘领,或者其他隨便一種語言的都能理解什么是搜索路徑。
比如說樱调,我們在學(xué)習(xí)java的時(shí)候约素,我們需要配置環(huán)境,將lib文件夾加入到path路徑中笆凌,而這個(gè)path路徑圣猎,其實(shí)就可以理解為搜索路徑。
而python中的搜索路徑乞而,就是存放module的路徑送悔,用代碼表示的話就是:
import sys
print(sys.path)
這個(gè)sys.path就是搜索路徑。
搜索路徑是干什么的呢?
為什么我們要將java的lib放到path中爪模,就是因?yàn)槲覀冊谡{(diào)用java的庫時(shí)欠啤,可以在這個(gè)路徑中找得到。
python的搜索路徑也是這樣:
他是一個(gè)list屋灌,里面存放的是許多絕對路徑洁段,當(dāng)我們import一個(gè)module的時(shí)候,python就會按照我們這個(gè)list中的順序查找每一個(gè)路徑共郭。
什么時(shí)候需要修改搜索路徑呢祠丝?
舉個(gè)例子:
我們在django中疾呻,在view中import自己的python文件,比如說就叫做login.py纽疟,然后在相同的文件夾中罐韩,我們需要在編寫一個(gè)與django分離開的爬蟲,比如說就叫做spider.py吧污朽;但是散吵,我們的爬蟲需要調(diào)用login這個(gè)腳本,但是這時(shí)候就出問題了蟆肆。
from .login import login
from apscheduler.scheduler import Scheduler
import pickle
#---------------------------
# 下面代碼省略
#---------------------------
這時(shí)候就會報(bào)錯:
ModuleNotFoundError: No module named '__main__.login'; '__main__' is not a package
這時(shí)候矾睦,我們需要補(bǔ)充一個(gè)知識點(diǎn):
python對于module的引用分為兩種,一種叫做相對引用炎功,一種叫做絕對引用枚冗,而我們絕大多數(shù)的引用都是相對引用。比如說蛇损,我們前面寫的from .login import login
但是赁温,相對引用是依賴于python的自建變量__name__的。
所以淤齐,我們來從__name__的角度分析一下股囊,為什么報(bào)錯?
首先更啄,如果稚疹,我們是從spider.py import login 那么,login這時(shí)候的__name__就是__main__.login祭务,但是根本沒有這個(gè)東西内狗,因?yàn)樵趐ython中,如果想要建立一個(gè)package义锥,必須在他所在的目錄下面創(chuàng)建__init__.py文件柳沙,可是__main__根本就不是一個(gè)文件夾,所以這樣的寫法是錯誤的拌倍。
所以赂鲤,要解決這個(gè)辦法,有兩種辦法:
- 再創(chuàng)建一個(gè)py文件贰拿,在這里面調(diào)用spider,這樣spider就不是__main__了熄云。
- 當(dāng)然膨更,我重點(diǎn)要說的是這一個(gè),也就是修改搜索路徑:
import sys, os
ROOT_PATH = os.path.abspath(os.path.join(os.getcwd(), ".."))
sys.path.append(ROOT_PATH)
from sword.login import login
這樣缴允,我們的搜索路徑中就有了sword荚守,我們就可以這樣引用了珍德。
等你接納我的那一天