Python3中requests脚本运行异常但Python2及交互模式正常
问题解决:重命名你的Python脚本文件
你碰到的这个问题其实是个很常见的“文件名冲突”踩坑案例——你的脚本叫http.py,和Python标准库中的http模块重名了,这直接引发了循环导入的错误。
为什么会出现这个错误?
仔细看错误日志的最后几行就能找到线索:
File "/usr/local/lib/python3.7/site-packages/urllib3/packages/six.py", line 82, in _import_module __import__(name) File "/Users/colechalland/Code/Python-3/Modern_Python3_Bootcamp/23_Making-HTTP-Requests/http.py", line 5, in <module> response = requests.get(url) AttributeError: module 'requests' has no attribute 'get'
当requests依赖的urllib3试图导入标准库的http.client模块时,Python会优先加载当前目录下的同名文件(也就是你的http.py)。而你的脚本里又在尝试导入requests并调用它的get方法,这时候requests模块还没完成全部初始化,自然就会抛出“找不到get属性”的错误。
至于为什么交互模式和Python2能正常运行:
- 交互模式下没有同名的
http.py干扰,Python会正确加载系统标准库的http模块; - Python2的模块搜索逻辑和标准库结构和Python3有差异,刚好没触发这个冲突。
怎么解决?
- 重命名你的脚本:把
http.py改成别的名字,比如my_http_request.py,只要不跟Python标准库的模块名重名就行; - 清理缓存文件:如果当前目录下有
http.pyc文件或者__pycache__文件夹,删掉它们(这些是Python的编译缓存,可能残留旧的引用); - 重新运行脚本:这时候应该就能正常执行了。
快速验证问题的方法
你可以在Python3交互模式里输下面的代码,看看http模块的来源:
import http print(http.__file__)
如果输出的是你自己的http.py路径,那实锤是文件名冲突;正常情况下应该输出Python标准库中http模块的路径。
内容的提问来源于stack exchange,提问作者Cole
相关产品推荐
相关产品推荐

