我确信这是一个非常简单的问题,而且我只是错过了一些非常明显的事情,但是这种困境的答案现在已经躲过了几个小时。
我的项目目录结构如下所示:
-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没有解释包并正确导入文件?
答案 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