反正有没有清除python字节码缓存?

时间:2011-01-12 01:04:06

标签: python cpython

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

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

谢谢!

4 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:4)

使用reload()

  

重新加载以前导入的模块。   参数必须是模块对象,   所以它一定是成功的   以前进口过。如果你这很有用   编辑了模块源文件   使用外部编辑器并希望   没有试用新版本   离开Python解释器。该   返回值是模块对象(   与模块参数相同。)

但是,模块需要已经加载。解决方法是处理生成的NameError

try:
    reload(math)
except NameError:
    import math

答案 2 :(得分: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]

答案 3 :(得分:0)

陷入类似的情况。 后来发现白色空间压痕技术很重要。 特别是在Windows平台上,确保采用统一的技术 整个模块,即只使用标签或空格。