簡體   English   中英

欺騙導入的腳本,以便它可以導入不存在的模塊

[英]fooling imported script so it can import module which does not exist

我正在編寫foob​​az python應用程序,該應用程序使用插件(在rules/plugins/目錄中)並從foob​​ar項目對這些插件進行測試(在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM