从子文件夹导入主文件(而不是另一个模块)

时间:2014-06-18 20:52:52

标签: python python-import

我想导入" 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.

2 个答案:

答案 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)

相对导入不能在文件系统级别工作,因此您想要做的事情不能像您所描述的那样使用相对导入。

听起来您遇到隐式相对导入问题(导入mainTestGPX隐式导入.GPX而不是GPX作为根模块)。您可以通过在所有测试文件的顶部添加此行来关闭此行为:

from __future__ import absolute_import

这将使GPX而不是sys.path的python导入.GPX