python import 搜索路径及相对导入和绝对导入

python 接收器的搜索路径

1、当前工作目录。

通过import os

os.getcwd() 可以查看当前的工作目录。

在命令行通过 python xx/yy/zz.py 文件执行时,当前的工作目录是 xx 所在的路径,但是加入到搜索路径的是 zz.py 所在的路径。

2、PYTHONPATH 环境变量中的目录。(如果是在运行python时新添加PYTHONPATH 环境变量,需要下次重新运行python 此环境变量中的值才有效。)

3、标准库目录,这个目录是安装时自动配置的。

4、特定路径下的 .pth 文件中所包含的路径。

(该特定路径指的是

import site

site.getsitepackages() 所得到的路径

In [12]: site.getsitepackages()
Out[12]:
['D:\\ProgramData\\Anaconda3',
 'D:\\ProgramData\\Anaconda3\\lib\\site-packages'])

a、添加到环境变量中

python import 搜索路径及相对导入和绝对导入_第1张图片

b、 .pth 文件置于python 安装的顶层目录。D:\\ProgramData\\Anaconda3

python import 搜索路径及相对导入和绝对导入_第2张图片

c、 .pth 文件置于sitepackages 目录。

python import 搜索路径及相对导入和绝对导入_第3张图片

 

所有的搜索路径,最终都会在 sys.path中体现出来,a、b、c前三部添加的搜索路径。

python import 搜索路径及相对导入和绝对导入_第4张图片

另外,如果想动态的添加到sys.path中:

1、使用site.addXX 系列函数。

2、使用sys.path.append 列表的方法。

 

相对导入与绝对导入

相对导入与绝对导入说的都是包内的导入。

python import 搜索路径及相对导入和绝对导入_第5张图片

在python3 中,

相对导入

from .  和 from .. import 等通过点表示层级的显示相对导入。.表示当前模块,.. 表示上一级模块,... 表示上上一级模块。

#y.py
from . import zz

 

 绝对导入

带上包的名字。

#y.py
from bar import zz

存在相对导入的模块都不能直接运行

相对导入的模块运行报错:

#y.py
from . import zz
print(__name__)

这是因为 python 这有一个 top-level 模块,top-level 模块的名字永远为 __main__,.即当前运行的脚本的模块名字是 " __main__",所以报错。

绝对导入的模块运行如果报错,则只会是模块所在的路径不在所有路径当中:

#y.py
from bar import zz
print(__name__)

这是因为 python bar/y.py 这样运行,加入到搜索路径的是 y.py 所在的路径。导致 bar 包不在解释器的搜索路径当中,所以 bar 无法识别。

在 pycharm 当中,右键代码目录,选中 Mark Directory as -- Source Root 选项,会将当前目录加入到解释器的搜索路径当中。将外层的 daily_fragment 标记为 Source Root,使用绝对导入,也能在 pycharm 里运行脚本。

python import 搜索路径及相对导入和绝对导入_第6张图片

相对导入和绝对导入的模块, 可以使用 -m 选项告诉解释器层级来执行,最外层层级在搜索路径当中。脚本作为模块运行,没有最后的扩展后缀 .py。

其实也是解释器将层级最外层的目录加入搜索路径,如果import 时绝对导入指定了多层,运行时相应的 -m 选项也要指定多层。

#y.py

from daily_fragment.bar import zz
print(__name__)

 

所有模块找不到的报错,都是由于该模块所在的路径不在搜索路径当中。

 

 

你可能感兴趣的:(python)