[英]fooling imported script so it can import module which does not exist
我正在編寫foobaz python應用程序,該應用程序使用插件(在rules/plugins/
目錄中)並從foobar項目對這些插件進行測試(在rules/tests/
)。 我不控制這些(插件及其測試)。
由於測試中有import語句,因此我無法弄清楚如何運行這些語句。 測試看起來像這樣:
$ 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
如果我無法編輯插件或測試,是否可以通過某種方式使其運行?
如果可以編輯測試,則可以執行以下操作:
- 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
這樣一來,測試就能找到需要的東西。 我以前沒有意識到這一明顯的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.