Python2.7使用from importlib import abc报错及importlib2异常的解决方法
解决Python2.7中
importlib.abc/importlib.util导入错误及importlib2报错的方案 问题背景
Python3中可正常使用from importlib import abc和from importlib import util,但Python2.7无原生支持,使用importlib2 3.5.0.2版本会触发NotImplementedError。
可行解决办法
1. 放弃importlib2,改用Python2.7原生模块兼容
Python2.7的imp模块是importlib的前身,abc模块也提供了核心抽象类功能,可通过版本判断实现兼容:
import sys if sys.version_info >= (3, 0): from importlib import abc, util else: # Python2.7 兼容层 import abc import imp # 模拟importlib.abc的核心类 class MetaPathFinder(abc.ABC): @abc.abstractmethod def find_module(self, fullname, path=None): pass class Loader(abc.ABC): @abc.abstractmethod def load_module(self, fullname): pass # 封装成与Python3一致的结构 class ImportlibABC: MetaPathFinder = MetaPathFinder Loader = Loader abc = ImportlibABC() # 模拟importlib.util的常用功能 class ImportlibUtil: @staticmethod def find_spec(fullname, path=None, target=None): try: _, pathname, _ = imp.find_module(fullname.split('.')[-1], path) return type('MockSpec', (), { 'name': fullname, 'origin': pathname, 'loader': None })() except ImportError: return None @staticmethod def module_from_spec(spec): module = sys.modules.setdefault(spec.name, imp.new_module(spec.name)) module.__file__ = spec.origin module.__name__ = spec.name return module util = ImportlibUtil()
2. 降级importlib2到兼容版本
importlib2 3.5.0.2对Python2.7的支持存在问题,可尝试安装旧版本:
pip uninstall -y importlib2 pip install importlib2==0.5.1
安装完成后再测试import importlib2及相关导入。
3. 使用官方backport包
安装专门为Python2设计的importlib backport(注意不是importlib2):
pip install importlib==1.0.4
但需注意该包的API与Python3的importlib不完全一致,可能需要调整部分代码调用逻辑。
内容的提问来源于stack exchange,提问作者yujiaErika
相关产品推荐
相关产品推荐

