python的相对导入
最近断断续续学习flask,学到蓝本时候有点小问题卡住了,问题如下
导入包的时候py文件里使用了相对路径导入,但是这种导入方法不是很明白,就自己搜索加实验了终于有点眉目了
先定义一个包
adb包
这个包里面有2个py文件
__init__.py
app.py
两个文件代码如下
__init__.py
import os class Main: def __init__(self): pass def shows(self): return "ss" main = Main() text = os.getcwd()
app.py
from . import main from . import text class Adb: def __init__(self, name): self.name = name def show(self): return self.name
我们单独执行app.py的话会报错
说是找不到main模块
这是为啥呢,后来百度了一番,虽然自己还不明白,但是大概意思是说,这种相对路径导入方法,不能直接执行这个app.py文件,需要别的py文件来调用这个adb包,才能执行app里导入的东西,那我们就创建一个Py文件,创建的这个py文件在adb文件夹的上一目录
看下代码
test.py
from adb import app x = app.Adb("joke") print(x.show()) print(app.main.shows()) print(app.text)
执行这个文件看下结果
这次结果正确了
虽然还不是很明白,但是至少知道怎么使用了,包内py文件导入当前目录内的其他py文件定义的类,函数或者变量等,导入后,直接执行包内的这个py文件是会报错的,也就是包内相对导入后,只能在包的外部导入这个包来调用。
相对导入只能用于同一个package里,并且包内的文件不能单独运行
也就是说在adb这个包里
__init__.py和app.py可以相互导入相互定义的东西,但是不能导入包外其他py文件定义的,并且导入后这2个py文件都不能单独运行了