在一个Python项目中,使用Docker部署项目的发布包。
每次发布的时候,基于ubuntu:latest构建镜像,然后使用pip install requests安装requests软件包。
2015.5.27,我们在例行发布的时候,突然遇到如下异常:
userbbauto@bba-207:/$ /usr/bin/python3 /home/userbbauto/bbauto/src/bbautoserver.py -p JohnPerTommy334 Traceback (most recent call last): File "/home/userbbauto/bbauto/src/bbautoserver.py", line 41, in <module> from bbconfiggen import BbConfigGenerator File "/home/userbbauto/bbauto/src/bbconfiggen.py", line 31, in <module> from erisconnection import ErisConnection File "/home/userbbauto/bbauto/src/erisconnection.py", line 32, in <module> requests.packages.urllib3.disable_warnings() AttributeError: module 'requests' has no attribute 'packages'
注意到错误的根源是,在安装的第三方requests软件包中,已经没有packages这个属性了。
检查requests软件包,发现确实在其路径下没有packages子路径了。
而在我们的项目代码中,存在如下调用语句:
import requests from requests.packages.urllib3.exceptions import InsecureRequestWarning requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
因requests软件包的变化导致了异常。
查看requests软件包的Release Notes,发现requests软件包发布了2.17.0版本,修改了requests软件包对urllib3软件包的引用方式。
如下图所示,在requests软件包2.17.0版本之前,requests软件包以packages子目录的形式,直接将urllib3软件包包含在requests软件包中。
但是,从requests软件包2.17.0版本开始,requests软件包不再直接包含任何第三方类库。
但是在安装requests软件包的同时,会安装其依赖的其他第三方类库:
Installing collected packages: certifi, chardet, idna, urllib3, requests
import urllib3 urllib3.disable_warnings(InsecureRequestWarning)
欣慰的是,requests开发团队也很快发现了该不兼容性问题,开了4105问题。在发布2.17.0版本之后,迅速发布了2.17.1-2.17.3版本,修复了该兼容性问题。
for package in ('urllib3', 'idna', 'chardet'): locals()[package] = __import__(package) # This traversal is apparently necessary such that the identities are # preserved (requests.packages.urllib3.* is urllib3.*) for mod in list(sys.modules):
参考链接:
Requests release notes,http://docs.python-requests.org/en/master/community/updates/
https://github.com/requests/requests/