4

我正在运行的每个单元测试都将 python 代码写入文件,然后将其作为模块导入。问题是代码发生了变化,但进一步的导入语句不会修改模块。

我认为我需要一种强制重新加载模块或清除内部字节码缓存的方法。有任何想法吗?

谢谢!

4

4 回答 4

8

重新导入模块很难正确处理所有边缘情况。reload的文档提到了其中一些。根据您正在测试的内容,您可能会更好地通过单独调用解释器来测试导入,例如通过subprocess运行每个。它可能会更慢,但也可能更安全和更准确的测试。

于 2011-01-12T01:25:43.130 回答
4

使用reload().

重新加载以前导入的模块。参数必须是一个模块对象,所以它必须之前已经成功导入。如果您使用外部编辑器编辑了模块源文件并且想要在不离开 Python 解释器的情况下试用新版本,这将非常有用。返回值是模块对象(与模块参数相同)。

但是,模块需要已经加载。一种解决方法是处理结果NameError

try:
    reload(math)
except NameError:
    import math
于 2011-01-12T01:05:54.097 回答
3

将您的代码写入不同名称的模块。将新代码写入现有文件并尝试再次导入将无法正常工作。

或者,您可以破坏sys.modules. 例如:

class MyTestCase(unittest.TestCase):
    def setUp(self):
        # Record sys.modules here so we can restore it in tearDown.
        self.old_modules = dict(sys.modules)

    def tearDown(self):
        # Remove any new modules imported during the test run. This lets us
        # import the same source files for more than one test.
        for m in [m for m in sys.modules if m not in self.old_modules]:
            del sys.modules[m]
于 2011-01-12T01:50:02.137 回答
0

遇到了类似的情况。后来发现空格缩进技术用的东西。特别是在 Windows 平台上,确保在整个模块中采用统一的技术,即仅使用制表符或空格。

于 2017-02-10T08:44:28.970 回答