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、添加到环境变量中
b、 .pth 文件置于python 安装的顶层目录。D:\\ProgramData\\Anaconda3
c、 .pth 文件置于sitepackages 目录。
所有的搜索路径,最终都会在 sys.path中体现出来,a、b、c前三部添加的搜索路径。
另外,如果想动态的添加到sys.path中:
1、使用site.addXX 系列函数。
2、使用sys.path.append 列表的方法。
相对导入与绝对导入说的都是包内的导入。
在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 里运行脚本。
相对导入和绝对导入的模块, 可以使用 -m 选项告诉解释器层级来执行,最外层层级在搜索路径当中。脚本作为模块运行,没有最后的扩展后缀 .py。
其实也是解释器将层级最外层的目录加入搜索路径,如果import 时绝对导入指定了多层,运行时相应的 -m 选项也要指定多层。
#y.py
from daily_fragment.bar import zz
print(__name__)
所有模块找不到的报错,都是由于该模块所在的路径不在搜索路径当中。