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 module之搜索路径)