查看: 1663|回复: 2

Importing an installed package from a script raises AttributeError module has...

[复制链接]

9

主题

74

帖子

185

积分

注册会员

Rank: 2

积分
185
发表于 2018-9-19 12:03:11 | 显示全部楼层 |阅读模式
我有一个名为的脚本requests.py导入request包。该脚本无法访问包中的属性,也无法导入它们。为什么这不起作用,我该如何解决?
以下代码抛出一个AttributeError。
  1. import requests

  2. res = requests.get('http://www.google.ca')
  3. print(res)
复制代码

Traceback (most recent call last):
  File "/Users/me/dev/rough/requests.py", line 1, in <module>
    import requests
  File "/Users/me/dev/rough/requests.py", line 3, in <module>
    requests.get('http://www.google.ca')
AttributeError: module 'requests' has no attribute 'get'
以下代码抛出一个ImportError。
  1. from requests import get

  2. res = get('http://www.google.ca')
  3. print(res)
复制代码

Traceback (most recent call last):
  File "requests.py", line 1, in <module>
    from requests import get
  File "/Users/me/dev/rough/requests.py", line 1, in <module>
    from requests import get
ImportError: cannot import name 'get'
以下代码抛出一个ImportError。
  1. from requests.auth import AuthBase

  2. class PizzaAuth(AuthBase):
  3.     """Attaches HTTP Pizza Authentication to the given Request object."""
  4.     def __init__(self, username):
  5.         # setup any auth-related data here
  6.         self.username = username

  7.     def __call__(self, r):
  8.         # modify and return the request
  9.         r.headers['X-Pizza'] = self.username
  10.         return r
复制代码

Traceback (most recent call last):
  File "requests.py", line 1, in <module>
    from requests.auth import AuthBase
  File "/Users/me/dev/rough/requests.py", line 1, in <module>
    from requests.auth import AuthBase
ImportError: No module named 'requests.auth'; 'requests' is not a package
回复

使用道具 举报

5

主题

41

帖子

108

积分

注册会员

Rank: 2

积分
108
发表于 2018-9-19 14:07:15 | 显示全部楼层
发生这种情况是因为你指定的本地模块会影响你使用的已安装requests模块。当前目录是前置的sys.path,因此本地名称优先于已安装的名称。
出现这个问题时,额外的调试技巧是仔细查看Traceback,并意识到你所讨论的脚本名称与你尝试导入的模块匹配:
请注意你在脚本中使用的名称:
File "/Users/me/dev/rough/requests.py", line 1, in <module>
你要导入的模块: requests
将该模块重命名为其他名称以避免名称冲突。
Python可能会requests.pyc在你的文件旁边生成一个文件requests.py(__pycache__在Python 3 的目录中)。在重命名后删除它,否则解释器仍将引用该文件,重新产生错误。但是,如果文件已被删除,则pyc文件__pycache__ 不应影响你的代码py。
在该示例中,将文件重命名为my_requests.py,删除requests.pyc并再次成功运行输出<Response [200]>。
回复

使用道具 举报

10

主题

72

帖子

180

积分

注册会员

Rank: 2

积分
180
发表于 2018-9-19 14:13:05 | 显示全部楼层
用户创建的脚本与库有名称冲突,问题可能不在于生成错误的脚本的名称(如2楼所示),也不在该脚本显式导入的库模块的任何名称中。可能需要一些检测工作来确定导致问题的文件。
作为说明问题的示例,假设你正在创建一个脚本,该脚本使用“decimal””库进行精确的十进制数浮点计算,并将脚本命名为“ mydecimal.py”,其中包含“ import decimal” 行。这没有任何问题,但你发现它引发了这个错误:
AttributeError: 'module' object has no attribute 'Number'
如果你之前编写了一个名为“ numbers.py” 的脚本,则会发生这种情况,因为“decimal”库调用标准库“numbers”,但会找到旧脚本。即使你删除了它,也可能不会结束问题,因为python可能已将其转换为字节码并将其作为“ bytecode.pyc” 存储在缓存中,因此你也必须将其删除。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表