【问题标题】:Python IDLE openpyxl - AttributeError when running scriptPython IDLE openpyxl - 运行脚本时出现AttributeError
【发布时间】:2016-01-13 08:22:52
【问题描述】:

我正在尝试从脚本中使用 openpyxl。

在 IDLE shell 中使用 openpyxl 时,一切顺利:

Python 2.7.9 |Anaconda 2.2.0 (32-bit)| (default, Dec 18 2014, 17:00:07) [MSC    v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import openpyxl as px
>>> wb = px.workbook.Workbook()
>>> 

我可以使用所有其他 openpyxl 功能。

但是,当把它放在脚本中时......:

import openpyxl as px
wb = px.workbook.Workbook()

(注意脚本被调用/保存为'openpyxl_2.py')

并在 IDLE 中运行脚本,我收到以下错误:

Python 2.7.9 |Anaconda 2.2.0 (32-bit)| (default, Dec 18 2014, 17:00:07) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 

Traceback (most recent call last):
  File "\\verdc01\userdocs$\wkvdleeden\My Documents\Python excel\openpyxl_2.py", line 1, in <module>
    import openpyxl as px
  File "\\verdc01\userdocs$\wkvdleeden\My Documents\Python excel\openpyxl.py", line 8, in <module>
AttributeError: 'module' object has no attribute 'workbook'
>>>

使用 Python 2.7.9 和 openpyxl 2.3.2(用 pip 很好地安装)。

问题:

如何从脚本运行我得到上述错误? 如何让它工作?

发布脚本 - 请注意,我已经检查了以下主题: cannot import workbook in openpyxl, Import error for openpyxl, openpyxl library - jdcal error

【问题讨论】:

  • 尝试重命名 python 文件。看起来您已将其命名为与模块名称相同。所以模块会被脚本“遮蔽”。 see this
  • @M4rtini 已经尝试过了。为了更好地衡量,还重新启动了计算机,以绝对确定 IDLE 不会仍然引用某种旧的脚本副本。但是感谢您的提示!
  • 所以错误输出中提到的文件被重命名了? "\\verdc01\userdocs$\wkvdleeden\My Documents\Python excel\openpyxl.py" 您可以尝试打印px.__file__ 的输出以查看实际加载的模块。
  • 啊,当然:另一个名为“openpyxl.py”的文件仍在该文件夹中...@M4rtini 'px.__file__' 成功了。请将其添加为答案,我会接受作为答案(如果可能的话,请投票)。非常感谢!!

标签: python shell attr python-idle openpyxl


【解决方案1】:

问题是同一文件夹中名为“openpyxl.py”的脚本。 导入openpyxl 模块时,将导入此本地脚本\模块而不是全局模块。

重命名此文件,它应该可以工作。 print px.__file__ 确认实际导入了哪个模块。

另一个常见的陷阱,尤其是对于初学者来说,是使用本地模块 隐藏标准库或第三方名称的名称 应用程序依赖的包或模块。一个特别 与这个陷阱发生冲突的令人惊讶的方法是使用这样的名称 脚本,因为这与前面的“执行主 模块两次”陷阱造成麻烦。例如,如果尝试 了解更多关于 Python 的 socket 模块,你可能会倾向于调用 你的实验脚本socket.py。事实证明这是一个非常糟糕的 想法,因为使用这样的名称意味着 Python 解释器不能再 在标准库中找到真正的套接字模块,很明显 当前目录中的socket模块碍事:

Source(Nick Coghlan's Python Notes)

【讨论】:

    猜你喜欢
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 2019-03-22
    • 2021-06-19
    相关资源
    最近更新 更多