python模块可以相对导入和绝对导入,但这两者是不能替换使用的。本文主要讨论工作目录下模块之间的导入规则。其中相对导入前面有一个'.',表示从该脚本所在目录开始索引,而绝对导入前面没有'.',表示从根目录开始索引。首先明确一点,python认为的根目录为当前运行的脚本所在的目录,而不是vscode打开的工作目录的根目录。则基于python运行时的根目录,python模块导入主要依据以下三个规则:
1、对于需要通过根目录的导入路径,必须使用绝对路径,否则出错。
2、对于根目录以下子目录模块之间的导入,此时没有通过根目录,则必须使用相对路径,否则出错。
3、无法导入根目录的父目录及以上目录中的模块。
比如,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需要导入p11p1.py中的模块,则必须使用绝对导入。
2、如果d11p1.py需要导入d11p2.py中的模块,则必须使用相对导入。
3、如果d11p1.py需要导入d1p2.py中的模块,则必须使用绝对导入。
4、d1p1.py无法导入d2目录下和main.py中的模块。