Skip to content

Python引用方法提示ModuleNotFoundError No module named ‘XXXX’

问题场景:跨文件夹引用方法时,经常会提示找不到对应文件夹

&emsp;ModuleNotFoundError: No module named 'XXXX'<br>

问题分析:

python 在执行 import 语句时,按照 python 的文档,它执行了如下操作:

  1. 第 1 步,创建一个新的,空的 module 对象(它可能包含多个 module);
  2. 第 2 步,把这个 module 对象插入 sys.module 中
  3. 第 3 步,装载 module 的代码(如果需要,首先必须编译,我们可以看到程序运行后会多出很多.class 文件)
  4. 第 4 步,执行新的 module 中对应的代码。

在执行第 3 步时,首先要找到 module 程序所在的位置,其原理为:

如果需要导入的 module 的名字是 m1,则解释器必须找到 m1.py,它首先在当前目录查找,然后是在环境变量 PYTHONPATH 中查找。 PYTHONPATH 可以视为系统的 PATH 变量一类的东西,其中包含若干个目录。如果 PYTHONPATH 没有设定,或者找不到 m1.py,则继续搜索 与 python 的安装设置相关的默认路径,在 Unix 下,通常是/usr/local/lib/python。

事实上,搜索的顺序是:当前路径 (以及从当前目录指定的 sys.path),然后是 PYTHONPATH,然后是 python 的安装设置相关的默认路径。正因为存在这样的顺序,如果当前 路径或 PYTHONPATH 中存在与标准 module 同样的 module,则会覆盖标准 module。也就是说,如果当前目录下存在 xml.py,那么执 行 import xml 时,导入的是当前目录下的 module,而不是系统标准的 xml。

Python 中的 package 定义很简单,其层次结构与程序所在目录的层次结构相同,这一点与 Java 类似,唯一不同的地方在于,python 中的 package 必须包含一个__init__.py的文件(用于表示此目录是一个 python package)。

例如,我们可以这样组织一个 package:

package1/
    __init__.py
    subPack1/
        __init__.py
        module_11.py
        module_12.py
        module_13.py
    subPack2/
        __init__.py
        module_21.py
        module_22.py

__init__.py 可以为空,只要它存在,就表明此目录应被作为一个 package 处理。当然,__init__.py 中也可以设置相应的内容。

原文链接:https://ceshiren.com/t/topic/31612