【问题标题】:Odd behavior of tabula-pytabula-py 的奇怪行为
【发布时间】:2019-02-28 09:17:15
【问题描述】:

我正在使用 Python 3.5 和 Anaconda 发行版。 tabula-py 版本 1.1.1 已安装。当我运行以下简单程序时:

import tabula

df = tabula.read_pdf("sample.pdf", pages=1, encoding="ISO-8859-1")

df.columns = df.iloc[0]

df.drop(0, inplace=True)

我收到以下错误消息:

AttributeError: module 'tabula' has no attribute 'read_pdf'

但是:如果我打开 Spyder 并在运行代码之前先在 IPython 控制台中键入“import tabula”,它运行得很好。如果我重新启动内核,我会得到同样的错误,直到我关闭并重新打开 Spyder。

有什么想法吗?提前致谢。

【问题讨论】:

  • 是的。 Spyder 有一个共享的命名空间。导入的模块被缓存。你不应该依赖这种行为;您应该在脚本顶部显式导入模块
  • 你叫你脚本tabula.py吗?

标签: python tabula


【解决方案1】:

Spyder 在您的控制台和脚本之间有一个共享的命名空间。我回答了这个问题的反面here

控制台中定义的任何内容都可以在您运行的脚本的命名空间中访问。模块导入缓存在所有脚本中,因此您可以在控制台中导入一次,然后在所有脚本中无限期地访问它(直到您重置内核)。

您不应依赖此行为,因为该脚本无法在 Spyder 之外运行。相反,您应该在脚本顶部显式导入模块。

在这种情况下,您可能已将脚本命名为 tabula.py,您应该重命名它。

【讨论】:

  • 不确定我是否理解您的评论,roganjosh。看我的剧本。第一行是“import tabula”,所以我确实在脚本顶部导入了它,并没有将其称为 tabula-py。
  • @SteveOlsen 是的,但是导入会被缓存,因此在控制台中导入具有该名称的模块后,脚本顶部的导入不会执行任何操作。 import tabula; print(tabula.__file__) a) 重启内核后仅在脚本中导入,b) 重启内核后仅在控制台中导入,您会得到什么?
  • 如果我在编辑器中运行它之前在控制台中运行它,我得到上面的错误,“没有属性'read_pdf'。如果我在控制台中运行它之前在编辑器中运行它,它有效。如果我重新启动内核,除非我关闭 Spyder,否则它将无法工作;即使我在控制台中执行“import tabula”,我也会收到同样的错误。如果我运行“import tabula; print(tabula.__file__) 在控制台或编辑器中,我得到相同的东西,它映射到 tabula 库中的 init.py 文件。
  • 还有一个注意事项:如果我打开 Spyder,只突出显示第一行(导入表格)并在编辑器中运行该单行,然后重新运行整个程序,这也可以。但是如果我开始只是在编辑器中运行程序,它会抛出错误。
  • 在尝试了网络上的每一个线程来解决这个问题后,没有运气,我转而在另一个 Python 项目上工作了几天,其中涉及安装和更新各种包。当我回到这个项目时 - 问题就消失了。不知道为什么 - 很抱歉其他人遇到这个问题,这显然对你没有帮助。在 SAS 中开发应用程序 5 年后,我喜欢 Python,但不得不承认,功能更强大的开源软件有时会有点问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多