如何修复“试图在非包中进行相对导入”,即使使用了

2024-04-26 07:20:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用以下目录结构跟踪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

我四处搜索,找到了“relative path not working even with __init__.py”和“Import a module from a relative path”,但他们没有帮助。

我有什么遗漏吗?


Tags: pathinfrompycoretestimport目录
3条回答

如果将当前目录附加到sys.path,则可以直接使用import components.core

if __name__ == '__main__' and __package__ is None:
    from os import sys, path
    sys.path.append(path.dirname(path.dirname(path.abspath(__file__))))

详细说明Ignacio Vazquez-Abrams's答案:

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

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

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

是的。你不能把它当作一个包裹。

python -m pkg.tests.core_test

相关问题 更多 >