注意事项一
python的“包相对导入”只适用于在包内的相对导入。如果执行的顶层语句不属于包,则无需使用“包相对导入”。否则会提示:ImportError: cannot import name 'test001' from '__main__' (test.py)。因为test.py并不是一个包,它只是一个顶层执行程序,虽然在test.py的路径下包含了test001包。正确的方式应该是在test001包内的python文件执行"from . import XXX"。这样才能正确执行包相对导入。

注意事项二
包的相对导入,应该是在包的内部路径上执行。例如test目录下有三个包test001,test002,test003。这三个包都是test目录下的三个包。如果test001下想导入test002的包,则应通过绝对导入完成导入,因为test002 包路径在sys.path目录下。

如果想在test001使用相对导入test002,则应该将test002放入到test001包目录下,否则执行会报错:ValueError: attempted relative import beyond top-level package


注意事项三
python3.0和python2.6都开始提供“包的相对导入”的功能,两者都是通过from语句前面的“.”符号来指定。但是python3.0和python2.0在包的相对导入使用方式上还有一定区别的。
(1)、python3.0默认是绝对导入,即通过搜索sys.path路径查找模块或者包,如果在各个path的路径上没有查找到对应的包或者模块名字,则会直接报错,提示无法:ModuleNotFoundError: No module named 'XXXX'。如下图,虽然test002是test001下的一个包,但是由于python3.7是绝对导入,这就导致执行python3.7 test.py的时候,sys.path路径上找不到test002的包,因为sys.path是test目录和其他库函数目录。

(2)、python2.0默认是相对导入,即先执行相对导入包,如果没有找到相关包,再执行绝对导入。在python2.0上执行就不会有类似于python3.0的报错。

网友评论