1.Python import 报错:"ModuleNotFoundError: No module named xxxx.yyyy"
- 如果是从 site-pacakges里import ,请确认你已经安装了这个库,或者安装了正确的版本。
- 如果是导入你Python工程中的某些代码,请把对应的路径加入到 sys.path中:sys.path.insert(0, 'your_path')。
- 如果是导入你自己代码目录下的namespace package,请确认其名称没有与内置库或者第三方库中的库名称重复。
2. Python中 import的包路径查找顺序:
在 python3.3以前,如果一个目录及其子文件想成为一个package,那么这个目录下面必须要有 __init__.py文件; 但在 python3.3之后,一个目录下可以不含 __init__.py文件,此时这个目录称为 namespace package。 于是,在python3.3以后,有两种package: 常规的package(含有__init__.py文件)和 namespace package。
当import xxx的时候, Python解释器会先查找是否是 内置(built-in)库; 如果不是内置库,则继续按照以下先后顺序查找:
1 如果按照sys.path的路径搜寻到一个常规的package,那么Python导入这个package,本次搜寻返回;
2 如果按照sys.path的路径搜寻到一个module文件,那么导入这个文件,本次搜寻返回;
3 如果按照sys.path的路径搜寻到一个目录,并且不包含__init__.py文件,那么就将这个目录记录下来(即namespace package),同时继续按照sys.path中下一个路径开始搜寻
4 如果经过1,2,3步骤都没有搜寻到指定的目录,那么,继续按照sys.path中的一个路径开始搜寻
当遍历完成所有的sys.path中的路径,同时也没有发现常规的package和module文件,那么,就按照namespace package的__path__属性包含的路径,再进行一次搜寻,如果找到,就导入,否则,导入失败。
换句话说,namespace package中__path__属性包含的路径,起到了类似sys.path的作用。
在内置库,常规package和第三方库都找不到此package的时候,最后再查找 namespace package。
注意:
1. sys.path是动态的,一般是由: 当前文件路径、环境变量PYTHONPATH中的路径、Python安装路径以及第三方库路径等组成。可以在代码中sys.path.insert(0, 'your_pacakge_path')来添加搜寻路径,但仅对当前文件有效。
2.无论是常规package,还是namespace package,如果想要搜寻到,都必须把起对应的路径添加到 sys.path中去,方法:设置PYTHONPATH或者代码中sys.path.insert