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

新手上路,请多包涵

我正在尝试遵循 PEP 328 ,具有以下目录结构:

 pkg/
  __init__.py
  components/
    core.py
    __init__.py
  tests/
    core_test.py
    __init__.py

core_test.py 我有以下导入语句

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 相对路径也不起作用”和“ 从相对路径导入模块”,但它们没有帮助。

我在这里有什么遗漏吗?

原文由 skytreader 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 787
2 个回答

是的。你没有把它当作一个包来使用。

 python -m pkg.tests.core_test

原文由 Ignacio Vazquez-Abrams 发布,翻译遵循 CC BY-SA 3.0 许可协议

详细说明 Ignacio Vazquez-Abrams 的 回答:

Python 导入机制相对于当前文件的 __name__ 。当你直接执行一个文件时,它没有它通常的名字,而是 "__main__" 作为它的名字。所以相对导入不起作用。

正如 Igancio 所建议的,您可以使用 -m 选项执行它。如果您的包中有一部分要作为脚本运行,您还可以使用 __package__ 属性来告诉该文件它在包层次结构中应该具有的名称。

有关详细信息,请参阅 http://www.python.org/dev/peps/pep-0366/

原文由 BrenBarn 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题