AttributeError: module 'requests' has no attribute 'packages'

在一个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

既然urllib3已经作为独立的第三方软件被安装,修改项目代码如下,即可解决该异常。

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软件包2.17.3版本,就可以不必修改项目代码,保持了兼容性。



参考链接:

Requests release notes,http://docs.python-requests.org/en/master/community/updates/

https://github.com/requests/requests/


你可能感兴趣的:(python,ubuntu,requests,urllib3,2.17.0)