愚弄导入的脚本,以便它可以导入不存在的模块

2024-09-20 22:54:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写foobazpython应用程序,它使用插件(在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

而且它会工作(经过测试)


Tags: frompytestimport插件syspluginstests
1条回答
网友
1楼 · 发布于 2024-09-20 22:54:14

好的,在与同事讨论后,有一个非常简单的方法来解决这个问题:

$ mkdir foobar
$ mv rules/ foobar/
$ touch foobar/__init__.py
$ touch foobar/rules/__init__.py
$ touch foobar/rules/plugins/__init__.py

通过这种方式,测试将能够找到它需要的东西。我以前没有意识到这件显而易见的事情

相关问题 更多 >

    热门问题