欺骗导入的脚本,以便它可以导入不存在的模块
fooling imported script so it can import module which does not exist
我正在编写 foobaz python 应用程序,它使用插件(在 rules/plugins/
目录中)并测试这些插件(在 rules/tests/
) 来自项目 foobar。我不控制这些(插件和它们的测试)。
由于测试中的导入语句,我不知道如何 运行 这些。测试看起来像这样:
$ cat rules/tests/test_something.py
import unittest
from foobar.rules.plugins import something
class TestSomething(unittest.TestCase):
def test_something_equals(self):
self.assertEqual(1, something.equals(1))
插件本身可以如下所示:
$ cat rules/plugins/something.py
def equals(i):
return i
我用来 运行 所有测试的脚本如下所示:
$ cat tests.py
#!/usr/bin/env python
import sys
import unittest
sys.path.append('rules/tests/')
from test_something import TestSomething
if __name__ == '__main__':
unittest.main()
当我想执行测试时,我(毫不奇怪)得到:
$ ./tests.py
Traceback (most recent call last):
File "./tests.py", line 8, in <module>
from test_something import TestSomething
File "rules/tests/test_something.py", line 6, in <module>
from foobar.rules.plugins import something
ImportError: No module named foobar.rules.plugins
鉴于我无法编辑插件或测试,有什么方法可以得到这个 运行ning 吗?
如果我可以编辑测试,我会这样做:
- from foobar.rules.plugins import something
+ import sys
+ sys.path.append('rules/plugins/')
+ import something
它会起作用(已测试)。
好的,经过与同事的讨论,有一个非常简单的方法可以解决这个问题:
$ mkdir foobar
$ mv rules/ foobar/
$ touch foobar/__init__.py
$ touch foobar/rules/__init__.py
$ touch foobar/rules/plugins/__init__.py
这样测试就能找到需要的东西。我以前没有意识到这个显而易见的事情。
我正在编写 foobaz python 应用程序,它使用插件(在 rules/plugins/
目录中)并测试这些插件(在 rules/tests/
) 来自项目 foobar。我不控制这些(插件和它们的测试)。
由于测试中的导入语句,我不知道如何 运行 这些。测试看起来像这样:
$ cat rules/tests/test_something.py
import unittest
from foobar.rules.plugins import something
class TestSomething(unittest.TestCase):
def test_something_equals(self):
self.assertEqual(1, something.equals(1))
插件本身可以如下所示:
$ cat rules/plugins/something.py
def equals(i):
return i
我用来 运行 所有测试的脚本如下所示:
$ cat tests.py
#!/usr/bin/env python
import sys
import unittest
sys.path.append('rules/tests/')
from test_something import TestSomething
if __name__ == '__main__':
unittest.main()
当我想执行测试时,我(毫不奇怪)得到:
$ ./tests.py
Traceback (most recent call last):
File "./tests.py", line 8, in <module>
from test_something import TestSomething
File "rules/tests/test_something.py", line 6, in <module>
from foobar.rules.plugins import something
ImportError: No module named foobar.rules.plugins
鉴于我无法编辑插件或测试,有什么方法可以得到这个 运行ning 吗?
如果我可以编辑测试,我会这样做:
- from foobar.rules.plugins import something
+ import sys
+ sys.path.append('rules/plugins/')
+ import something
它会起作用(已测试)。
好的,经过与同事的讨论,有一个非常简单的方法可以解决这个问题:
$ mkdir foobar
$ mv rules/ foobar/
$ touch foobar/__init__.py
$ touch foobar/rules/__init__.py
$ touch foobar/rules/plugins/__init__.py
这样测试就能找到需要的东西。我以前没有意识到这个显而易见的事情。