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. 编辑:我希望能够使用这个单位测试或鼻子.
我的猜测(如果我做错了,我将删除它)是通过以下操作,您试图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)