从子文件夹导入主文件(而不是另一个模块)(import main file (not ano

2019-11-03 06:07发布

我想导入“主”从子文件夹。 因此每个子文件夹包含一个__init__.py(而不是“源”,它的实际名称为“曲目的Comparer”)。 我的文件夹结构是这样的:

source\
  GPX\
    engine.py  (contains Engine class)
  main.py
    from GPX.engine import Engine
  Tests\
    Integration Tests\
      GPX\
        engineTest.py
      mainTest.py

我想用“主”从mainTest.py,所以我尝试:

from ... import main 

但does'n工作。 错误: 非包尝试相对进口

我使用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的发射试验。

为了解决我想使用相对路径(在测试中的文件)的问题,但它不工作,因为我说。

什么是错误的,我相对路径进口? 这是做好这项工作的正确方法? 我使用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.

Answer 1:

假设您目前在集成测试文件夹? 那这个呢:

from os import path
import sys
currentDirectory = path.dirname(__file__)
sys.path.append(path.join(currentDirectory, '../../')) # This will get you to source
import main


Answer 2:

相对进口不会在文件系统级别的工作,你想做的事不能用相对导入,你所描述的这样做的。

这听起来像您有(与隐含的相对进口问题mainTest当您导入GPX它含蓄地进口.GPX而不是GPX作为根模块)。 您可以通过在所有的测试文件的顶部添加此行关闭此行为:

from __future__ import absolute_import

这将使进口蟒蛇GPXsys.path ,而不是.GPX



文章来源: import main file (not another module) from a subfolder