PyDev 从二级源文件夹导入

PyDev importing from secondary source folders

总结:使用 PyDev,我无法获得一个 Python 模块 (FooTest) 以在同一(测试)源文件夹中导入另一个 (FooMock)。

我有两个源文件夹和四个Python模块,目录结构如下。最小的示例代码在问题的末尾。虽然我提供了很多信息,但请不要被这吓到 - 这是一个简单的问题场景。

PyDevProject/
  src/         (source folder for prod code)
    foo/
      __init__.py
      Bar.py
      Foo.py
  test/        (source folder for tests)
    foo/
      __init__.py
      FooMock.py
      FooTest.py

这里的问题是,当我尝试在 FooTest 模块中导入 FooMock class 时,出现以下错误(运行 将 PyUnit 运行 FooTest 测试):

Finding files... done.
Importing test modules ... Traceback (most recent call last):
  File "/Applications/Eclipse.app/Contents/Eclipse/plugins/org.python.pydev_4.5.4.201601292234/pysrc/_pydev_runfiles/pydev_runfiles.py", line 468, in __get_module_from_str
mod = __import__(modname)
  File "/Users/me/Development/krtiWorkspace/ImportTest/test/foo/FooTest.py", line 4, in <module>
    from foo.FooMock import FooMock
ImportError: No module named FooMock
ERROR: Module: FooTest could not be imported (file: /Users/me/Development/krtiWorkspace/ImportTest/test/foo/FooTest.py).
done.

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

我尝试过的事情:

我能做些什么吗?

代码:

# Code for Bar.py -----------------------------------------------------
class Bar(object):
    def __init__(self, foo):
        self.foo = foo
    def next(self):
        self.foo.incr()

# Code for Foo.py -----------------------------------------------------
class Foo(object):
    def __init__(self):
        self.num = 0
    def incr(self):
        self.num = self.num + 1

# Code for FooMock.py -------------------------------------------------
class FooMock(object):
    def mock_incr(self):
        self.hit = True

# Code for FooTest.py -------------------------------------------------
import unittest
from foo.Foo import Foo
from foo.Bar import Bar
from foo.FooMock import FooMock

class Test(unittest.TestCase):
    def test_Foo(self):
        foo = Foo()
        foo.incr()
        self.assertEquals(1, foo.num, "should be 1")
    def test_Bar(self):
        foo = FooMock()
        bar = Bar(foo)
        bar.next()

if __name__ == "__main__":
    unittest.main()

目录截图: Image showing directory structure and PYTHONPATH as previously explained

您的 PYTHONPATH 中有一个名为 foo 的模块两次。在第一个目录中,找到包 foo 的地方,确实没有名为 FooMock.

的模块

能否将测试源目录下的模块foo重命名为其他名称?喜欢 footests 而不是 foo?