Python导入requests出现Traceback - "部分初始化的模块'requests'没有属性'post'"

15

我想通过Python发送HTTP POST请求。已通过pip3 install requests安装requests模块,并显示"需求已满足",因此已安装。

我正在使用Python版本3.8.0

代码:

import requests as r
headers = {'Accept' : 'application/json', 'Content-Type' : 'application/json'}
url = 'http://localhost:8083/push/message'
jsons = {"test"}
r.post(url, json=jsons, headers=headers)

错误:

Traceback (most recent call last):
  File "http.py", line 1, in <module>
    import requests as r
  File "C:\User\name\AppData\Local\Programs\Python\Python38\lib\site-packages\requests\__init__.py", line 43, in <module>
    import urllib3
  File "C:\User\name\AppData\Local\Programs\Python\Python38\lib\site-packages\urllib3\__init__.py", line 7, in <module>
    from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool, connection_from_url
  File "C:\User\name\AppData\Local\Programs\Python\Python38\lib\site-packages\urllib3\connectionpool.py", line 11, in <module>
    from .exceptions import (
  File "C:\User\name\AppData\Local\Programs\Python\Python38\lib\site-packages\urllib3\exceptions.py", line 2, in <module>
    from .packages.six.moves.http_client import IncompleteRead as httplib_IncompleteRead
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 655, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 618, in _load_backward_compatible
  File "C:\User\name\AppData\Local\Programs\Python\Python38\lib\site-packages\urllib3\packages\six.py", line 199, in load_module
    mod = mod._resolve()
  File "C:\User\name\AppData\Local\Programs\Python\Python38\lib\site-packages\urllib3\packages\six.py", line 113, in _resolve
    return _import_module(self.mod)
  File "C:\User\name\AppData\Local\Programs\Python\Python38\lib\site-packages\urllib3\packages\six.py", line 82, in _import_module
    __import__(name)
  File "C:\scripts\http.py", line 5, in <module>
    r.post(url, json=jsons, headers=headers)
AttributeError: partially initialized module 'requests' has no attribute 'post' (most likely due to a circular import)

当我关闭命令行并启动一个新的命令行,然后进入 python ,我可以导入它:

C:\Windows\system32>python
Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:37:50) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> requests.post
<function post at 0x000001A4F7B9D310>
>>>

执行脚本时,有时会发生相同的情况(仅有时)。 (顺便说一句,当它正常工作时,它也像应该那样发布到服务器)

是否有人遇到过类似的问题,并可能提出解决方案? 顺便说一下,Python 3是我在这台机器上安装的唯一Python版本 - 但在其他计算机上也面临着类似的问题!

7个回答

32

感谢Unixia的回答,它在某些方面对我有所帮助 :)

但是我有一些改进,我遇到了相同的错误,是因为我将文件命名为requests.py,与原始的requests库产生了冲突。


1
听起来你需要重新命名Python的.py文件。不幸的是,我的文件被命名为token.py。 - cona
@cona 似乎是一个非常敏感的区域。我的文件名叫做 http.py,导致了问题。 - webs

18

你的脚本可能存在其他问题,我没有进行检查,但是你收到的错误是因为你的文件名为http.py。看起来它正在被其他地方使用,并且导致了循环引用的问题。请更改文件名。


13

循环依赖: 当两个或多个模块相互依赖时发生。这是因为每个模块都是根据另一个模块定义的。

如果你遇到类似于下面请求模块错误的循环导入错误。

AttributeError: partially initialized module 'requests' has no attribute 'post' (most likely due to a circular import)

请尝试更改文件名。这个错误通常是由于您正在尝试导入requests模块的文件名与其冲突所致。

我也遇到了同样的问题,我的文件名为email.py,我正试图导入请求模块。因此,它与email.parser产生了一些冲突。因此,我将文件名从email.py更改为email1.py,它就起作用了。

有关循环依赖的更多信息:https://stackabuse.com/python-circular-imports/


1
我的文件名是token.py。重命名后,它运行良好。建议Requests团队提供一个禁止使用的文件名列表是个好主意。 - F.Tamy

2
如果您的路径中有一个名为token.py的文件,也会出现此问题。这是在Mac OS 12.4上使用Python 3.8.9和Requests版本2.28.1时的情况。

0
根据以上讨论,我们需要检查正在执行的文件名,确保它与模块拥有的任何属性都不匹配。
我们可以使用以下方式进行检查:
import requests \
print(dir(requests))

在我们确定不使用相关模块的任何属性后,我们还需要确保当前目录中的任何其他文件也不具有该属性名称。我曾经遇到过同样的错误。


-1

重命名文件并尝试 有时可能会起作用


-1
这里也有同样的问题,肯定是文件名的问题。记住,不要给你的.py脚本命名为已经存在的模块的名称,尤其是当你确定在项目中使用它们时。
例如,我有一个requests.py文件导入了requests模块,http.py等情况也可能发生。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接