这里似乎已经有了一些关于python 3中相对导入的问题,但在浏览了许多之后,我仍然没有找到我的问题的答案。 问题来了。

我有一个如下所示的包

package/
   __init__.py
   A/
      __init__.py
      foo.py
   test_A/
      __init__.py
      test.py

我在test.py中有一行:

from ..A import foo

现在,我在包的文件夹,我运行

python -m test_A.test

我收到消息

"ValueError: attempted relative import beyond top-level package"

但是如果我在包的父文件夹中,例如,我运行:

cd ..
python -m package.test_A.test

一切都很好。

现在我的问题是: 当我在包的文件夹中,我运行test_A子包中的模块作为test_A。测试,根据我的理解,..A只上升了一层,仍然在包文件夹中,为什么它给出消息说在顶层包之外。导致此错误消息的确切原因是什么?


当前回答

如果在上层文件夹中有__init__.py,可以将导入初始化为 导入文件/路径作为初始化文件的别名。然后你可以使用它在较低的脚本:

import alias

其他回答

只需移除…在test.py 对我来说,pytest很好地解决了这个问题 例子:

from A import foo

如果在上层文件夹中有__init__.py,可以将导入初始化为 导入文件/路径作为初始化文件的别名。然后你可以使用它在较低的脚本:

import alias

在python2中不确定。X,但在python 3.6中,假设你试图运行整个套件,你只需要使用-t

-t,——顶级-directory目录 项目的顶级目录(默认为开始目录)

在一个结构上

project_root
  |
  |----- my_module
  |          \
  |           \_____ my_class.py
  |
  \ tests
      \___ test_my_func.py

例如,你可以用:

Python3 unittest discover -s /full_path/project_root/tests -t /full_path/project_root/

仍然导入my_module。My_class没有大的戏剧。

从包中。一个import foo

我认为这比

import sys
sys.path.append("..")

package/
   __init__.py
   A/
      __init__.py
      foo.py
   test_A/
      __init__.py
      test.py

在A/__init__.py中导入foo:


from .foo import foo

当从test_A/导入A/时


import sys, os
sys.path.append(os.path.abspath('../A'))
# then import foo
import foo