Python ImportError由导入搜索顺序引起

时间:2019-08-09 23:23:46

标签: python python-3.x python-import

我具有以下文件夹结构:

MyApp  # project folder
    MyApp  # source folder
        __init.py__ # empty, just here to mark the MyApp folder as a package
        MyApp.py  # actual program
        _Config.py
    _Implementation
        _ImplementationFile.py

MyApp.py是实际程序,并且是正在执行的脚本。

# MyApp.py
from MyApp import _Config
from MyApp._Implementation._ImplementationFile import _ImplementationClass

此操作因ImportError cannot import _Config from MyApp (<path>\\MyApp\\MyApp\\MyApp.py)而中断。

错误很简单:Python尝试从MyApp.py而不是从其包含MyApp的文件夹中导入所有这些内容。将MyApp文件夹重命名为MyApp1可以消除该错误,从而确认问题的根源。

决议是我开始提出问题的地方。我想使用绝对导入来避免获取我的文件中的歧义,因为我还导入了一些带有自己的_Config文件等的不同库脚本。我也想保持MyApp文件夹和模块名称完整无缺,因为程序的名称。

this question中,我了解到在检查导入时,程序包应优先于模块。 Python documentation似乎支持这一点:

  

导入名为垃圾邮件的模块时,解释器首先搜索   具有该名称的内置模块。如果找不到,则进行搜索   在目录给定的目录列表中查找名为spam.py的文件   变量sys.path。 sys.path从以下位置初始化:

     

包含输入脚本的目录(如果未指定文件,则为当前目录)。

“包含输入脚本的目录”应该是MyApp文件夹。

  1. 为什么Python会在MyApp文件夹之前检查MyApp模块?
  2. 除了重命名模块或文件夹之外,还有没有办法将Python指向正确的方向?
  3. 这对于Python项目来说是否也是正确的文件夹结构,还是应该剪切MyApp源文件夹并将源文件直接移动到MyApp项目根文件夹下? (我意识到这个问题可能是基于观点的。我将对问题1和问题2感到满意,这些问题不是。我怀疑将所有内容上移仍会触发ImportErrors,仅在项目文件夹而不是源文件夹上。)

0 个答案:

没有答案