python模块导入规则(相对导入和绝对导入)
python模块可以相对导入和绝对导入,但这两者是不能随意替换使用的。本文主要讨论工作目录下模块之间的导入规则。其中相对导入前面有一个'.',表示从该脚本所在目录开始索引,而绝对导入前面没有'.',表示从根目录开始索引。首先明确一点,python认为的根目录为当前运行的脚本所在的目录,而不是vscode打开的工作目录的根目录。则基于python运行时的根目录,python模块导入主要可以总结为一句话:需要通过根目录的导入路径,必须使用绝对导入。换句话说,如果相对导入的导入路径通过了根目录,就会出错。此外,需要注意的是,无法导入根目录的父目录及以上目录中的模块。
举例
以下举了一些实例,vscode打开如下名为import_test的目录:
d1 | --__init__.py --d1p1.py --d1p2.py --d11 | --__init__.py --d11p1.py --d11p2.py d2 | --__init__.py --d2p1.py --d21 | --__init__.py --d21p1.py main.py
当运行main.py时,此时根目录为import_test:
1、如果main.py需要导入d1p1.py中的模块,必须使用绝对导入。
2、如果d1p1.py需要导入d11p1.py中的模块,既可以使用相对导入,也可以使用绝对导入。
3、如果d1p1.py需要导入d2p1.py中的模块,必须使用绝对导入。
当运行时d1p1.py时,此时根目录为d1:
1、如果d1p1.py需要导入d11p1.py中的模块,必须使用绝对导入。
2、如果d11p1.py需要导入d11p2.py中的模块,既可以使用相对导入,也可以使用绝对导入。
3、如果d11p1.py需要导入d1p2.py中的模块,必须使用绝对导入。
4、d1p1.py无法导入d2目录下和main.py中的模块。
文件夹和脚本同名情况
注意!当存在文件夹和python脚本同名时优先导入文件夹模块。比如如下路径:
test | --__init__.py main.py test.py
可以看出,其中包含相同名称的文件夹test和python代码文件test.py。当main.py中包含import test时,导入的是test.__init__.py模块,而不是test.py模块。