是否有方法清除Python字节码缓存?
我每次运行单元测试的时候,都会把一些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。这样做可能会慢一些,但通常会更安全,也能更准确地进行测试。