我正在运行的每个单元测试都将 python 代码写入文件,然后将其作为模块导入。问题是代码发生了变化,但进一步的导入语句不会修改模块。
我认为我需要一种强制重新加载模块或清除内部字节码缓存的方法。有任何想法吗?
谢谢!
重新导入模块很难正确处理所有边缘情况。reload的文档提到了其中一些。根据您正在测试的内容,您可能会更好地通过单独调用解释器来测试导入,例如通过subprocess运行每个。它可能会更慢,但也可能更安全和更准确的测试。
使用reload()
.
重新加载以前导入的模块。参数必须是一个模块对象,所以它必须之前已经成功导入。如果您使用外部编辑器编辑了模块源文件并且想要在不离开 Python 解释器的情况下试用新版本,这将非常有用。返回值是模块对象(与模块参数相同)。
但是,模块需要已经加载。一种解决方法是处理结果NameError
:
try:
reload(math)
except NameError:
import math
将您的代码写入不同名称的模块。将新代码写入现有文件并尝试再次导入将无法正常工作。
或者,您可以破坏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]
遇到了类似的情况。后来发现空格缩进技术用的东西。特别是在 Windows 平台上,确保在整个模块中采用统一的技术,即仅使用制表符或空格。