1 Python如何相对导入包这份文档已经说得很清楚出了,不清楚的可以看看:python3-cookbook看看自己有没有写错。
2 如果你确定你的写法跟上面文档介绍的一样,但还是报错,那就看你是不是在模块内运行程序。按照上面链接写的模块包被外部程序导入时是没有任何问题的,但如果你直接在模块内运行代码,这种相对导入就会出现问题,就不能按链接里的方式导入了。举个很简单的例子:
下面的模块test1_import中有两个文件t1.py和t2.py
t1.py的内容如下:
from . import t2
def t1():
t2.t2()
if __name__ == '__main__':
# 在模块内里面运行会报错,
# 但是在外面导入这个包时,运行t1()函数一点问题都没有
t1()
t2.py的内容如下:
def t2():
print("我是test1_import文件夹下的t2")
如果你在t1.py下运行代码,就会报错:
from . import t2
ImportError: cannot import name 't2'
至于原因,官网给出了解释,但我还没看懂,大家可以自己看看。
如果你在模块外面导入这个包来使用,这样导入是完全没有问题的:
在test1_import模块外面创建一个t3.py文件,内容如下:
from test1_import import t1
t1.t1()
运行t3.py文件,完全没问题:
所以,如果你要在模块里面运行代码,你应该直接导入:
import t2
看,这样就能运行成功了。
总结:如果在模块外面导入模块的内容,按照链接里面介绍的方式导入包是完全没有问题的;但如果要在模块里面运行代码,就最好不要使用“.”来用作相对导入。