Python 相对导入找不到包
Python Relative Import cannot find package
我确信这是一个非常简单的问题,我只是遗漏了一些非常明显的东西,但我已经好几个小时没有找到这个困境的答案了。
我的项目目录结构是这样的:
-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 没有正确解释包和导入文件?
How to fix "Attempted relative import in non-package" even with __init__.py
好吧,我猜现在要开始使用 sys.path.append 了。为@BrenBarn、@fireant 和@Ignacio Vazquez-Abrams 鼓掌半
发生这种情况是因为您运行将脚本设置为__main__
。当你 运行 这样的脚本时:
python /path/to/package/module.py
该文件加载为 __main__
,而不是 package.module
,因此它不能进行相对导入,因为它不是包的一部分。
这可能会导致奇怪的错误,其中脚本中定义的 class 被定义了两次,一次是 __main__.Class
,另一次是 package.module.Class
,这可能会导致 isinstance
检查失败和类似的怪事。因此,您通常不应该直接 运行 您的模块。
对于您的测试,您可以删除测试目录中的 __init__.py
并只使用绝对导入而不是相对导入。事实上,您的测试可能根本不应该在您的包中。
或者,您可以创建一个测试 运行ner 脚本来导入您的测试并 运行s 它们。
我确信这是一个非常简单的问题,我只是遗漏了一些非常明显的东西,但我已经好几个小时没有找到这个困境的答案了。
我的项目目录结构是这样的:
-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 没有正确解释包和导入文件?
How to fix "Attempted relative import in non-package" even with __init__.py
好吧,我猜现在要开始使用 sys.path.append 了。为@BrenBarn、@fireant 和@Ignacio Vazquez-Abrams 鼓掌半
发生这种情况是因为您运行将脚本设置为__main__
。当你 运行 这样的脚本时:
python /path/to/package/module.py
该文件加载为 __main__
,而不是 package.module
,因此它不能进行相对导入,因为它不是包的一部分。
这可能会导致奇怪的错误,其中脚本中定义的 class 被定义了两次,一次是 __main__.Class
,另一次是 package.module.Class
,这可能会导致 isinstance
检查失败和类似的怪事。因此,您通常不应该直接 运行 您的模块。
对于您的测试,您可以删除测试目录中的 __init__.py
并只使用绝对导入而不是相对导入。事实上,您的测试可能根本不应该在您的包中。
或者,您可以创建一个测试 运行ner 脚本来导入您的测试并 运行s 它们。