python之绝对导入和相对导入
绝对导入
import sys, os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) sys.path.append(BASE_DIR)
__file__是相对路径,是因为pycharm吧之前的路径给补上了才没有报错,在终端执行就会报错,所以要用绝对路径。
import sys, os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR)
这样程序在哪执行都不会报错了
相对导入
import sys, os from . import models from ..proj import settings
一个点的意思是在当前目录导入
两个点是在上一级目录导入
../..是在上两级目录导入
需要注意的是文件夹被python解释器视作package需要满足两个条件:
1.文件夹中必须有__init__.py文件,该文件可以为空,但必须存在该文件。
2.不能作为顶层模块来执行该文件夹中的py文件(即不能作为主函数的入口)。
所以,当用.. 或 ../..返回上级去导入的时候,如果到了程序的入口就会报错:
ValueError: attempted relative import beyond top-level package
这是因为第2条的原因,也就是相对导入的时候不能返回到顶层目录去导入,否则会报错。所以,用绝对导入的人比较多,相对导入中一个点(同级导入)用的比较多。