我试图遵循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也无法工作”和“从相对路径导入模块”,但它们都没有帮助。

这里有什么我遗漏的吗?


当前回答

因为您的代码包含if __name__==“__main__”,而该代码不能作为包导入,所以最好使用sys.path.append()来解决问题。

其他回答

对我来说,只有这样才能奏效:我必须将package的值显式设置为父目录,并将父目录添加到sys.path

from os import path
import sys
if __package__ is None:
    sys.path.append( path.dirname( path.dirname( path.abspath(__file__) ) ) )
    __package__= "myparent"

from .subdir import something # the . can now be resolved

我现在可以直接用python myscript.py运行我的脚本。

因为您的代码包含if __name__==“__main__”,而该代码不能作为包导入,所以最好使用sys.path.append()来解决问题。

在core_test.py中,执行以下操作:

import sys
sys.path.append('../components')
from core import GameLoopEvents

试试这个

import components
from components import *

如果有人在寻找变通办法,我偶然发现了一个。这里有一点上下文。我想测试我在文件中的一种方法。当我从内部运行时

if __name__ == "__main__":

它总是抱怨相对进口。我尝试应用上述解决方案,但失败了,因为有许多嵌套文件,每个文件都有多个导入。

这是我所做的。我刚刚创建了一个启动器,一个外部程序,可以导入必要的方法并调用它们。尽管这不是一个很好的解决方案,但它还是有效的。