Python2转Python3兼容:ConfigParser MissingSectionHeaderError属性错误排查
解决Python2/Python3兼容下ConfigParser异常捕获的问题
这个问题挺典型的——Python3把ConfigParser模块重命名成了小写的configparser,异常类的归属也跟着变了,要同时兼容两个版本得从导入兼容和异常引用两方面调整。
第一步:统一模块导入的兼容写法
先替换掉原来的import ConfigParser,用下面的代码适配两个版本:
try: # Python 2环境下导入并别名 import ConfigParser as configparser except ImportError: # Python 3环境下直接导入 import configparser
这样不管在哪个版本里,我们都能用configparser这个统一名称来调用模块内容,从根源上避免版本差异导致的属性找不到问题。
第二步:调整异常捕获的写法
现在直接用统一的configparser前缀引用异常类就可以了,修改后的完整代码如下:
import os # 先处理兼容导入 try: import ConfigParser as configparser except ImportError: import configparser logOutCfg = configparser.ConfigParser() try: if os.path.isfile(logOutfilename): logOutCfg.read(logOutfilename) except configparser.MissingSectionHeaderError: pass except configparser.ParsingError as e: print(str(e)) pass
为什么之前的尝试无效?
如果之前单独写import configparser在Python2里会直接报错(Py2没有这个小写模块);要是保留import ConfigParser又用configparser.MissingSectionHeaderError,自然会找不到属性——得先通过兼容导入让configparser这个名称在两个版本里都指向正确的模块,异常引用才能生效。
额外提示
如果你的项目有大量这类兼容需求,可以考虑用six库(专门处理Py2/Py3兼容的工具库),它提供了from six.moves import configparser的写法,能省去手动写try-except导入的步骤;但如果不想引入额外依赖,上面的手动写法完全够用,且能保证至少9个月的兼容性(只要运行环境还是Py2.7和Py3.6+)。
内容的提问来源于stack exchange,提问作者Zitt
相关产品推荐
相关产品推荐

