在Code Workbooks Transform中使用cProfile遇re未定义错误的疑问
解决cProfile.run中NameError: name 're' is not defined的问题
你遇到的问题根源在于cProfile.run()的执行机制:它会为传入的字符串语句创建全新的全局/局部命名空间,你在外部代码里导入的re模块并不在这个新命名空间中,所以执行字符串语句时会找不到re。
可行的解决方案:
方案1:将导入逻辑嵌入待执行字符串
把import re直接放到cProfile.run()的字符串参数里,让它在目标命名空间中完成导入:import cProfile cProfile.run('import re; re.compile("foo|bar")')方案2:使用
runctx()传入当前命名空间
用cProfile.runctx()替代run(),手动把当前代码的全局和局部命名空间传递进去,这样待执行语句就能访问到已导入的re:import cProfile import re cProfile.runctx('re.compile("foo|bar")', globals(), locals())方案3:封装成函数再分析
把要性能分析的代码封装成独立函数,然后分析函数调用——这种方式更清晰,也能避免命名空间问题:import cProfile import re def compile_pattern(): re.compile("foo|bar") cProfile.run('compile_pattern()')
至于你提到其他transform里re能正常使用,是因为那些场景下代码都是在当前命名空间直接执行,没有像cProfile.run()这样隔离出独立的执行上下文,所以不会出现命名找不到的问题。
内容的提问来源于stack exchange,提问作者Chris A.
相关产品推荐
相关产品推荐

