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
我尝试过的事情:
- 尽管 FooMock 和 FooTest 都在同一个 Python 包中,但无法导入 FooMock。
- 将 FooMock 移动到
src/
目录下是有效的,即使放置在一个独特的 Python 包下(只要它在 src/
下)。但这对我来说是不能接受的(在生产源文件夹中有测试代码)。
- 我已确保 PyDev 中的 PYTHONPATH 设置已设置为指定两个文件夹都是源文件夹。
- 将 FooMock 代码复制并粘贴到 FooTest 代码中即可。但这对我来说是不可接受的(因为我想在其他地方引用 FooMock,在多个测试文件中,我不希望 FooMock 的多个副本因此而浮动)。
我能做些什么吗?
代码:
# 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
?
总结:使用 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
我尝试过的事情:
- 尽管 FooMock 和 FooTest 都在同一个 Python 包中,但无法导入 FooMock。
- 将 FooMock 移动到
src/
目录下是有效的,即使放置在一个独特的 Python 包下(只要它在src/
下)。但这对我来说是不能接受的(在生产源文件夹中有测试代码)。 - 我已确保 PyDev 中的 PYTHONPATH 设置已设置为指定两个文件夹都是源文件夹。
- 将 FooMock 代码复制并粘贴到 FooTest 代码中即可。但这对我来说是不可接受的(因为我想在其他地方引用 FooMock,在多个测试文件中,我不希望 FooMock 的多个副本因此而浮动)。
我能做些什么吗?
代码:
# 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
?