我试图遵循PEP 328,其目录结构如下:
pkg/
__init__.py
components/
core.py
__init__.py
tests/
core_test.py
__init__.py
在core_test.py中,我有以下import语句
from ..components.core import GameLoopEvents
然而,当我运行时,我得到以下错误:
tests$ python core_test.py
Traceback (most recent call last):
File "core_test.py", line 3, in <module>
from ..components.core import GameLoopEvents
ValueError: Attempted relative import in non-package
四处搜索,我发现“相对路径即使使用__init__.py也无法工作”和“从相对路径导入模块”,但它们都没有帮助。
这里有什么我遗漏的吗?
python<main模块>.py不适用于相对导入
问题是当您从命令行运行__main__模块时,相对导入不起作用
python <main_module>.py
PEP 338中有明确规定。
2.5b1的发布显示了这个PEP和PEP328之间令人惊讶的交互(尽管现在回想起来很明显)——显式的相对导入在主模块中不起作用。这是因为相对导入依赖__name__来确定当前模块在包层次结构中的位置。在主模块中,__name__的值总是'__main__',因此显式相对导入总是失败(因为它们只适用于包内的模块)。
原因
Python Bug Tracker Issue1510172:绝对/相对导入不起作用?
这个问题实际上并不是-m开关独有的。问题是相对导入基于__name__,并且在主模块中,__name__始终具有__main__值。因此,相对导入当前无法从应用程序的主模块正常工作,因为主模块不知道它在Python模块名称空间中的真正位置(这至少在理论上对于通过-m开关执行的主模块是可以修复的,但直接执行的文件和交互式解释器完全不走运)。
要进一步了解,请参阅Python3中的相对导入,了解详细说明以及如何完成。
python<main模块>.py不适用于相对导入
问题是当您从命令行运行__main__模块时,相对导入不起作用
python <main_module>.py
PEP 338中有明确规定。
2.5b1的发布显示了这个PEP和PEP328之间令人惊讶的交互(尽管现在回想起来很明显)——显式的相对导入在主模块中不起作用。这是因为相对导入依赖__name__来确定当前模块在包层次结构中的位置。在主模块中,__name__的值总是'__main__',因此显式相对导入总是失败(因为它们只适用于包内的模块)。
原因
Python Bug Tracker Issue1510172:绝对/相对导入不起作用?
这个问题实际上并不是-m开关独有的。问题是相对导入基于__name__,并且在主模块中,__name__始终具有__main__值。因此,相对导入当前无法从应用程序的主模块正常工作,因为主模块不知道它在Python模块名称空间中的真正位置(这至少在理论上对于通过-m开关执行的主模块是可以修复的,但直接执行的文件和交互式解释器完全不走运)。
要进一步了解,请参阅Python3中的相对导入,了解详细说明以及如何完成。