我想导入" main"来自子文件夹。因此,每个子文件夹都包含__init__.py(但不是"源",其实际名称是" Tracks Comparer")。 我的文件夹结构是这样的:
source\
GPX\
engine.py (contains Engine class)
main.py
from GPX.engine import Engine
Tests\
Integration Tests\
GPX\
engineTest.py
mainTest.py
我想使用" main"来自mainTest.py ,所以我试过了:
from ... import main
但确实有效。 错误:在非包裹中尝试相对导入
我使用Visual Studio和"测试资源管理器"除mainTest.py外,所有测试都运行。 例如,在engineTest.py中有:
from GPX.engine import Engine
而不是这样:
from ...GPX.engine import Engine # this not works
并且在mainTest.py中,简单的import main
也可以。
更准确地说,使用Visual Studio启动测试也适用于mainTest,但是从GPX.engine导入引擎失败(错误:找不到引擎模块),我想因为它指的是"测试"中的GPX文件夹夹。 出于这些原因,我认为unittest.run()被称为""在Visual Studio启动测试时从root(源文件夹)。
要解决这个问题,我想使用相对路径(在测试文件中),但它并不像我所说的那样有效。
我的相对路径导入错误了什么? 这是完成这项工作的正确方法吗? 我使用的是Python 2.7。
在非包中尝试相对导入的解决方案: (在mainTest.py中)
import os, sys
sys.path.append(os.path.join("..", ".."))
import main
找不到引擎模块的解决方案: (在mainTest.py中)
#sys.path.append(os.path.join("..", ".."))
sys.path.insert(0, os.path.join("..", ".."))
# <-- this change set "source" earlier than "Integration Tests" in path.
答案 0 :(得分:1)
假设您目前处于Integration Tests文件夹中? 那怎么样:
from os import path
import sys
currentDirectory = path.dirname(__file__)
sys.path.append(path.join(currentDirectory, '../../')) # This will get you to source
import main
答案 1 :(得分:0)
相对导入不能在文件系统级别工作,因此您想要做的事情不能像您所描述的那样使用相对导入。
听起来您遇到隐式相对导入问题(导入mainTest
时GPX
隐式导入.GPX
而不是GPX
作为根模块)。您可以通过在所有测试文件的顶部添加此行来关闭此行为:
from __future__ import absolute_import
这将使GPX
而不是sys.path
的python导入.GPX
。