python搜索路径顺序_Python module之搜索路径
最近,好多事,新學期課又是出奇的多,于是我就好久沒更新了,今天周末,我決定將最近的學習所得整理一下,POST上來。
首先是,最近一直在做有關web開發的事,所以最近幾篇主要關于django框架的使用,以及python的一些奇淫技巧,而后,我會將SVM的文章更新上來(真是不務正業啊,哈哈哈)
什么是搜索路徑
其實,但凡學過C語言,或者其他隨便一種語言的都能理解什么是搜索路徑。
比如說,我們在學習java的時候,我們需要配置環境,將lib文件夾加入到path路徑中,而這個path路徑,其實就可以理解為搜索路徑。
而python中的搜索路徑,就是存放module的路徑,用代碼表示的話就是:
import sys
print(sys.path)
這個sys.path就是搜索路徑。
搜索路徑是干什么的呢?
為什么我們要將java的lib放到path中,就是因為我們在調用java的庫時,可以在這個路徑中找得到。
python的搜索路徑也是這樣:
他是一個list,里面存放的是許多絕對路徑,當我們import一個module的時候,python就會按照我們這個list中的順序查找每一個路徑。
什么時候需要修改搜索路徑呢?
舉個例子:
我們在django中,在view中import自己的python文件,比如說就叫做login.py,然后在相同的文件夾中,我們需要在編寫一個與django分離開的爬蟲,比如說就叫做spider.py吧;但是,我們的爬蟲需要調用login這個腳本,但是這時候就出問題了。
from .login import login
from apscheduler.scheduler import Scheduler
import pickle
#---------------------------
# 下面代碼省略
#---------------------------
這時候就會報錯:
ModuleNotFoundError: No module named '__main__.login'; '__main__' is not a package
這時候,我們需要補充一個知識點:
python對于module的引用分為兩種,一種叫做相對引用,一種叫做絕對引用,而我們絕大多數的引用都是相對引用。比如說,我們前面寫的from .login import login
但是,相對引用是依賴于python的自建變量__name__的。
所以,我們來從__name__的角度分析一下,為什么報錯?
首先,如果,我們是從spider.py import login 那么,login這時候的__name__就是__main__.login,但是根本沒有這個東西,因為在python中,如果想要建立一個package,必須在他所在的目錄下面創建__init__.py文件,可是__main__根本就不是一個文件夾,所以這樣的寫法是錯誤的。
所以,要解決這個辦法,有兩種辦法:
再創建一個py文件,在這里面調用spider,這樣spider就不是__main__了。
當然,我重點要說的是這一個,也就是修改搜索路徑:
import sys, os
ROOT_PATH = os.path.abspath(os.path.join(os.getcwd(), ".."))
sys.path.append(ROOT_PATH)
from sword.login import login
這樣,我們的搜索路徑中就有了sword,我們就可以這樣引用了。
等你接納我的那一天
總結
以上是生活随笔為你收集整理的python搜索路径顺序_Python module之搜索路径的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 空间句法软件_【特训营2:空间句法高阶班
- 下一篇: 网站改成静态页面打不开_稳定网站排名的基