首页 > 解决方案 > 如果我们已经导入了 urllib 和 urllib3,是否需要导入 requests lib 才能使用 requests?- urllibx,请求混淆

问题描述

我需要使用“请求”和urllib3. 在代码 中你可以看到这个库正在被导入,但同时它是一个模块/包里面,它也已经被导入了。
代码导入请求和打印目录(urllib3)
requestsurllib3

做一些研究,我发现 Python 带有urllib包,它带有request模块。另一方面,requests内部是一个模块urllib3,但它本身就是一个库。

urllib并且urllib2是标准的 Python 库,但urllib3它是一个完全独立的库,名称令人困惑。它的一部分已经包含在标准库中并requests依赖于它,但它不是urllib/的更新版本urllib2;真正想要改进的库是httplib(参考:Github)。

“在后台,requests使用urllib3来完成大部分的 http 繁重工作。如果使用得当,它应该基本相同,除非您需要更高级的配置”
(参考:堆栈交换):

我得出了这些结论,但我仍然感到困惑:如果我已经导入了urllib,我还需要导入requests吗?如果我进口了urllib3怎么办?

此外,应该requests单独导入,如所描述的代码中所示,还是应该从上述库之一导入?

标签: pythonpython-3.xpython-requestsurlliburllib3

解决方案


如果您正在使用该requests模块,那么这是您唯一需要导入的内容。其余的由 Python 为您处理。urllib3使用的requests是实现细节,除非您需要访问urllib3库定义的特定对象,否则您不需要将其导入代码库。

requests里面不是一个模块urllib3。该urllib3模块定义了一个urllib3.request(单数!)模块,它与包完全不同requests

>>> import urllib3
>>> import requests
>>> urllib3.request
<module 'urllib3.request' from '/Users/mj/Development/venvs/stackoverflow-latest/lib/python3.7/site-packages/urllib3/request.py'>
>>> requests
<module 'requests' from '/Users/mj/Development/venvs/stackoverflow-latest/lib/python3.7/site-packages/requests/__init__.py'>
>>> requests is urllib3.request
False

请注意,这是包命名空间urllib3.request内的一个模块。(no ) 不会导入它,因为它需要一个顶级名称。也不会,因为那将是与. 并且仅仅因为名称和相似并不意味着它们是相同的东西。HTTP 标准处理发送到服务器的请求和服务器返回响应的抽象概念,因此处理 HTTP 的不同项目中的名称通常会反映它们在代码中表示的概念。urllib3import requestsimport somethingelse.requesturllib3requestsrequest

这同样适用于名称urlliburllib2。曾几何时,Python 从一个urllib有限的包开始,后来urllib2又添加了一个包,扩展了第一个包并添加了更多功能。Python 3 合并了这两个包,并将功能重新组织成命名空间下的一系列新模块urllib。该urllib3软件包是一个独立项目,旨在为相同的功能构建更好的库。该项目的任何部分都没有被合并到 Python 标准库中。

requests是一个项目,它为您提供了一个干净、直接、易于使用的 API 来发出 HTTP 请求并处理结果响应。将它用于该 API,不必担心实现细节。


推荐阅读