在 Python 3 中导入模块时出现 AttributeError
Posted
技术标签:
【中文标题】在 Python 3 中导入模块时出现 AttributeError【英文标题】:AttributeError when importing modules in Python 3 【发布时间】:2015-01-03 10:08:04 【问题描述】:我正在尝试编写一个使用 json 和 requests 模块的脚本。在我编写脚本之前,我在交互式 shell 上玩弄命令,自从为我的代码创建了一个实际文件后,一切都以某种方式损坏了。我第一次运行代码时,文件夹中出现了一个 pycache 文件夹,我认为这在某种程度上破坏了一切。该代码在 shell 中逐行运行时,在存在此 pycache 文件夹的情况下也不再适用。我的代码如下:
import json
import requests
r = requests.get('http://api.wunderground.com/api/78c2f37e6d924b1b/hourly/q/CA/Berkeley.json')
data = json.loads(r.text)
for x in range(0, 35):
print(data['hourly_forecast'][x]['FCTTIME']['hour'])
这应该打印出天气预报中的所有时间,但我得到一个“AttributeError:'module'对象没有属性'dumps'。在这个文件夹中,我之前还有另一个使用外部模块的程序也没有long 适用于 pycache 文件夹的存在,所以我几乎可以肯定它导致了问题。但是,删除它并不能解决任何问题,因为代码仍然不起作用,它只是被重新创建。
编辑:通过删除整个错误目录并重写所有内容来解决问题。
【问题讨论】:
您之前是否进行过某种测试?尝试使用python -B
运行,看看是否能解决问题。
【参考方案1】:
'module' object has no attribute 'xxx'
的最常见原因是,其中“xxx”是您“知道”“module”确实具有的属性,是:您的程序位于具有您拥有的“module.py”的目录中忘记了。所以import module
导入您的模块而不是 stdlib(或其他地方)中的预期模块。在 python-list 上发布了多个有关此问题的示例。至少有两个是由于同一目录中的一个被遗忘的 random.py。
如果您发布了回溯,情况会更清楚。
【讨论】:
【参考方案2】:请参考这个 SO 问题What is pycache?,查看@scott_fakename 的回答:
当您在 python 中运行程序时,解释器会将其编译为 字节码优先(这是一个过度简化)并将其存储在 pycache 文件夹。如果您在那里查看,您会发现一堆文件共享项目文件夹中的 .py 文件的名称, 只有它们的扩展名是 .pyc 或 .pyo。这些是 字节码编译和优化的字节码编译版本 程序的文件,分别。
作为一名程序员,你基本上可以忽略它......它所做的只是让 你的程序启动得快一点。当你的脚本改变时,它们 将被重新编译,如果您删除文件或整个文件并运行 你的程序再次出现,它们会重新出现(除非你特别 抑制这种行为)
如果您使用的是 cpython(这是最常见的,因为它是 参考实现)并且你不想要那个文件夹,那么你可以 例如,通过使用 -B 标志启动解释器来抑制它
python -B foo.py
另一个选项,如 tcaswell 所述,是设置 环境变量 PYTHONDONTWRITEBYTECODE 为任何值(根据 到python的手册页,任何“非空字符串”)。
所以,你可以运行:
python -B xxx.py
或者,设置环境变量:
PYTHONDONTWRITEBYTECODE = 1
【讨论】:
我看到了那个答案,并使用 -B 标志运行 python,虽然它阻止了 pycache 文件夹的创建,但 AttributeError 仍然显示。设置环境变量也无济于事。 你在 virtualenv 中吗?您的情况可能需要重新安装 什么是 virtualenv? python本身也不是问题,如果我切换到另一个目录一切都很好。我应该删除文件夹并重试所有内容吗? @thenorm,是的,如果更改目录将解决此问题。如果您在 virtualenv 下,我的意思是重新安装json
模块。 virtualenv 是一个包装器,用于将您的 pip
模块安装与系统范围的安装分开
我认为我不需要重新安装 json 模块。无论如何,我删除了整个目录并重写了所有内容,这似乎可行。知道为什么会这样吗?以上是关于在 Python 3 中导入模块时出现 AttributeError的主要内容,如果未能解决你的问题,请参考以下文章
Python:尝试从同一包中导入模块时出现“ModuleNotFoundError”
在 Swift Playground 中导入 pod 时出现“没有这样的模块”
在 Angular 6 中导入“ngx-bootstrap/datepicker”模块时出现错误