我试图遵循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 core_test.py

那么你会得到这个错误ValueError:尝试在非包中进行相对导入

原因:您正在从非包源测试您的包。

所以从包源测试模块。

如果这是您的项目结构,

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

cd软件包

python -m tests.core_test # dont use .py

或从外部pkg/

python -m pkg.tests.core_test

仅有一个的如果要从同一目录中的文件夹导入。每后退一步,再加一步。

hi/
  hello.py
how.py

在how.py中

from .hi import hello

如果您想从hello.py导入how

from .. import how

其他回答

由于您已经将所有内容标记为模块,因此如果您作为python模块启动,则无需使用相对引用。

而不是

from ..components.core import GameLoopEvents

仅仅

from pkg.components.core import GameLoopEvents

当您从pkg的父级运行时,请使用以下命令

python -m pkg.tests.core_test

如果将当前目录附加到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__))))

这里有一种方法会惹恼所有人,但效果很好。在测试运行中:

ln -s ../components components

然后像往常一样导入组件。

这是非常令人困惑的,如果您使用的是像Pycharm这样的IDE,则会更加令人困惑。

对我有用的是:

进行Pycharm项目设置(如果您正在从VE或python目录运行python)你定义的方式没有错。有时,它可以与:

from folder1.file1 import class

如果不起作用,请使用:

import folder1.file1

您的环境变量应该在系统中正确提及或在命令行参数中提供。

试试这个

import components
from components import *