Python2.7+Django1.11环境下第三方Python3库导入语句适配方案咨询
第三方库Python版本导入兼容方案
以下方案无需修改虚拟环境内的第三方库源码,也不需要维护整份fork的代码副本,仅通过最小成本的前置配置即可解决导入报错问题:
- 利用Python导入机制做全局路径映射
Python导入模块时会优先读取sys.modules的缓存内容,只要在第三方库被导入前,把Python3生态的urllib.parse模块路径,映射到Python2.7下对应的方法实现,所有第三方库中写的from urllib.parse import urlencode, quote语句都能正常执行。
具体实现有两种低侵入方式:- 在项目根目录新建
sitecustomize.py,写入以下适配代码:
import sys # 仅在Python 2.7环境下执行适配 if sys.version_info[0] == 2: import urllib import types # 构造模拟的urllib.parse模块对象 fake_parse_module = types.ModuleType("urllib.parse") fake_parse_module.urlencode = urllib.urlencode fake_parse_module.quote = urllib.quote # 将模拟模块写入全局模块缓存 sys.modules["urllib.parse"] = fake_parse_module ``` 这种方式不需要修改项目原有业务代码,由于项目根目录默认在Python导入路径的优先级列表中,解释器启动时会自动加载这段适配逻辑。 2. 如果不想单独新增配置文件,可以把上述映射逻辑直接写在`manage.py`的最顶部,只要保证这段代码的执行时机早于所有第三方库的导入逻辑即可。 - 在项目根目录新建
- 在环境初始化脚本中自动执行轻量补丁
可以将第三方库单文件的导入语句替换逻辑,加到项目的虚拟环境初始化、部署流程脚本中,在第三方库安装完成后自动执行一次文本替换:
这种方式可以避免虚拟环境重置、依赖重装导致的补丁丢失问题,也不需要维护整份fork的代码仓库,仅保留一行替换规则即可完成适配。# 替换第三方库对应文件中的不兼容导入语句 sed -i 's/from urllib.parse import urlencode, quote/from urllib import urlencode, quote/g' <第三方库在site-packages中的实际文件路径>
注意:所有适配逻辑的执行时机必须早于第三方库的导入流程,否则依然会触发导入错误。
内容的提问来源于stack exchange,提问作者user2194805
相关产品推荐
相关产品推荐

