Python Relative Import无法找到包

时间:2016-07-28 19:48:38

标签: python package directory-structure relative-import

我确信这是一个非常简单的问题,而且我只是错过了一些非常明显的事情,但是这种困境的答案现在已经躲过了几个小时。

我的项目目录结构如下所示:

-PhysicsMaterial
   -Macros
      __init__.py
      Macros.py
   -Modules
      __init__.py
      AvgAccel.py
      AvgVelocity.py
   -UnitTests
      __init__.py
      AvgAccelUnitTest.py
      AvgVelocityUnitTest.py
    __init__.py

除了对我的命名约定和目录结构的批评,我似乎无法使用相对导入。我正在尝试相对导入要在AvgAccelUnitTest.py中测试的模块文件:

from .Modules import AvgAccel as accel

然而,我一直在:

ValueError: Attempted relative import in non-package

由于我在整个结构中设置了所有 init 文件,并且我还将顶级目录添加到我的PYTHONPATH中,所以我很难过。为什么python没有解释包并正确导入文件?

2 个答案:

答案 0 :(得分:3)

这是因为您将脚本作为__main__运行。当你运行这样的脚本时:

python /path/to/package/module.py

该文件加载为__main__,而不是package.module,因此它不能进行相对导入,因为它不是包的一部分。

这会导致奇怪的错误,其中脚本中定义的类被定义两次,一次定义为__main__.Class,另一次定义为package.module.Class,这可能导致isinstance检查失败和类似的怪异。因此,您通常不应直接运行模块。

对于测试,您可以删除tests目录中的__init__.py,只使用绝对导入而不是相对导入。事实上,您的测试可能根本不应该在您的包装内。

或者,您可以创建一个测试运行脚本来导入测试并运行它们。

答案 1 :(得分:0)

How to fix "Attempted relative import in non-package" even with __init__.py

好吧,现在猜它正在使用sys.path.append。拍拍@BrenBarn,@ fireant和@Ignacio Vazquez-Abrams