Python中的相对导入困惑

fir*_*300 5 python import importerror

我在查找如何在Python中进行相对导入时遇到了一些麻烦.我目前正在开展我的第一个重大项目,所以我想使用单元测试来做到这一点.但是,我的文件结构和相关导入有问题.

这是我目前的结构:

App/
  __init__.py
  src/
    __init__.py
    person.py
  tests/
    __init__.py
    person_tests.py
Run Code Online (Sandbox Code Playgroud)

我想要做的是能够将person.py导入person_tests.py进行单元测试.我尝试过以下方法:

from . import person
from .. import person
from .App.src import person
from ..App.src import person
from ..src.person import *
from ..src import person
from .src import person
Run Code Online (Sandbox Code Playgroud)

以上每一个都会引发语法错误或

ValueError: Attempted relative import in non-package
Run Code Online (Sandbox Code Playgroud)

有人可以帮我澄清一下吗?

编辑:Python版本是2.7. 编辑:我希望能够使用这个单位测试或鼻子.

aba*_*ert 5

我的猜测(如果我做错了,我将删除它)是通过以下操作,您试图person_tests.py用作顶级脚本,而不是包中的模块:

$ cd App/tests
$ python person_tests.py
Run Code Online (Sandbox Code Playgroud)

在这种情况下,person_tests不会以结束App.tests.person_tests,而是以结束__main__(或者,以稍有不同的形式,作为person_tests具有相同基本问题的顶层)。因此,..不会引用App,因此没有办法将其person作为相对导入。

更一般而言,上的任何内容PYTHONPATH(包括.)都不应位于任何程序包目录的中间,否则事情会被破坏。

正确的答案是不这样做。做这样的事情:

$ python -m App.tests.person_tests
Run Code Online (Sandbox Code Playgroud)

或编写一个用于导入模块的顶级(包外部)脚本,然后运行该顶级脚本。


小智 -1

您可以将其附加到 sys.path 中。

import sys
sys.path.append("../src")
import person
Run Code Online (Sandbox Code Playgroud)