2

我确信这是一个非常简单的问题,而且我只是遗漏了一些非常明显的东西,但是这个困境的答案已经让我想了好几个小时。

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

-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 不能正确解释包和导入文件?

4

2 回答 2

3

发生这种情况是因为您将脚本作为__main__. 当您运行这样的脚本时:

python /path/to/package/module.py

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

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

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

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

于 2016-07-28T20:17:00.977 回答
0

即使使用 __init__.py,如何修复“尝试在非包中进行相对导入”

好吧,猜猜现在该使用 sys.path.append 了。向@BrenBarn、@fireant 和 @Ignacio Vazquez-Abrams 鼓掌

于 2016-07-28T20:09:04.517 回答