当文件名(a.py文件)和文件夹名(文件夹a)相同时,在a.py文件中使用from a import xxx
,此时a会优先解析为a.py文件,而非文件夹a
python中import
某个A模块时,首先会从python的内置模块中查找是否含义该模块的定义;若未查询到会从sys.path
对应的模块路径查询是否含有对应模块的定义,如果搜索完成依然没有对应A模块时则抛出import
的异常
引用同级目录的其他*.py文件,可以直接用import
引用下级目录的其他*.py文件,可以直接用from xx import xx
引用其他目录的其他*.py文件,可以用如下代码将项目根目录所在的绝对路径加入sys.path
,即python搜索模块的路径列表,再从项目根目录采用from xx import xx
逐级向下引用
# 将项目根目录加入到sys.path中
# way 1
import sys
import os
# 返回当前目录的绝对路径(实质上,在vscode环境下,是项目所在的绝对路径,即.vscode文件夹所在的目录)
# 参数为‘..‘时,返回当前目录的上级目录的绝对路径
dir = os.path.abspath(‘.‘)
sys.path.append(dir)
# way 2
import sys
# 参数随引用文件所在的位置而定
# 参数为‘‘或者‘.‘,指的是项目的根目录
sys.path.append(‘.‘)
关于"."和".."
# 从当前package中查找XX
from . import XX
# 从上一层package中查找XX
from .. import XX
注意:若case/main.py作为入口文件"__main__",此时文件夹case是不会被当成一个package的。例如有目录树如下:
case/
|—— package1
| |—— __init__.py
| |—— file1.py
|—— package2
| |—— __init__.py
| |—— file2.py
|—— __init__.py
|—— main.py
同时有如下代码
# case/package1/file1.py
from .. import package2
# case/main.py
import package1.file1
此时虽然case文件夹下有"__init__.py"文件,理应作为一个package。但是当直接执行case/main.py时,就没有把完整的case当作一个package来处理。因此在main.py里import package1.file1
的时候,文件file1.py中的from .. import package2
会因为找不到上一层的package而报错。
同样的,将file1.py作为入口文件,文件夹case也不会被当作是一个package
原文:https://www.cnblogs.com/okcokc/p/13199864.html