是否有方法清除Python字节码缓存?

5 投票
4 回答
13019 浏览
提问于 2025-04-16 09:48

我每次运行单元测试的时候,都会把一些Python代码写到一个文件里,然后把这个文件当作模块导入。问题是,虽然代码有变化,但后面的导入语句并没有更新这个模块。

我觉得我需要一种方法,要么强制重新加载这个模块,要么清除内部的字节码缓存。有没有什么好主意?

谢谢!

4 个回答

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]
4

使用 reload()

这个函数可以重新加载之前已经导入的模块。你传入的参数必须是一个模块对象,也就是说这个模块之前必须已经成功导入过。如果你用外部编辑器修改了模块的源文件,想在不退出Python解释器的情况下测试新版本,这个功能就非常有用。这个函数的返回值是模块对象,也就是你传入的那个模块。

不过,模块必须已经被加载过。如果模块没有加载,你可能会遇到一个 NameError 错误,这时候可以用一些方法来处理这个错误:

try:
    reload(math)
except NameError:
    import math
8

重新导入模块有点复杂,因为要考虑到各种特殊情况。关于 reload 的文档提到了一些这些情况。根据你测试的内容,有时候你可能更适合通过单独启动解释器来测试导入,比如使用 subprocess。这样做可能会慢一些,但通常会更安全,也能更准确地进行测试。

撰写回答