Python 相对导入找不到包

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

最佳答案

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

python /path/to/package/module.py

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

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

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

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

关于Python 相对导入找不到包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38645486/

相关文章:

python - 非标 : iss predictions not matching nasa website

git - 在 Atom 中为 Linter 包安装包模块

Java:如何编译代码的整个目录结构?

directory-structure - 内页的 URL 结构?

python - 在 Pandas DataFrame 中计算多个综合分数

Python Pandas 矩阵乘法 多项运算合二为一

Python doit : Create subtasks using file generated from previous task

r - “记者”不可用

package - dpkg : how to ignore error in post/pre scripts

java - 在哪里存储用于单元测试的二进制文件